Abstract

XX

Introduction

XX

In this paper, we first introduce a child-friendly version of Weisman et al.’s (2017) experimental paradigm, validate it among US adults, and then use this paradigm to conduct an initial exploration of this conceptual structure and mental capacity attributions among US children, focusing on 7- to 9-year-old children (Study 1). Next, we replicate our findings with 7- to 9-year-old children using a briefer experimental paradigm, and use this briefer paradigm to assess the earlier development of this conceptual structure, focusing on 4- to 6-year-old children (Study 2). We then develop an even simpler version of the paradigm, using more basic vocabulary and a streamlined experimental protocol, with the aim of validating and refining our understanding of conceptual structure among 4- to 6-year-old children, as well as exploring how younger children’s attributions of different aspects of mental life might vary with age (Study 3). Finally, to supplement the group-level analyses picture of development provided by the exploratory factor analyses for Studies 1-3, we re-analyze these data using a novel, participant-level approach that allows us to observe how these conceptual structures might evolve and unfold continuously over development (“Continuous development at the participant level: A re-analysis of Studies 1-3”).

Overview of Methods and Analyses

Studies 1-3 used very similar experimental paradigms and were designed with the same analyses in mind. Here we provide an overview of the methods and planned analyses for all of these studies; any details that varied across studies are supplied in the “Methods” section of each of the studies.

General methods

Following Weisman et al. (2017), these studies were designed with the goal of focusing participants’ attention on the similarities, differences, and relationships among various mental capacities.

To this end, each participant was either randomly or pseudo-randomly assigned to assess 1-2 target entities (e.g., a beetle, a robot, a goat, etc.) on a wide range of sensory, perceptual, emotional, social, cognitive, and other mental capacities, ranging in number from 18-40 across studies and presented in either a random or a pseudo-random (counterbalanced) order. Participants were presented with a vivid, full-color photograph of their assigned target in a naturalistic context (e.g., a beetle on a leaf; a robot in an office; a goat in a grassy field), which they had access to throughout the study.

On each trial, participants were asked a question of the form Do you think a [target] can [do X]? (e.g., “Do you think a beetle can feel happy?”; Studies 1-2) or Can [targets] [do X]? (Study 3) (e.g., “Can beetles feel happy?”). Participants responded on a three-point scale (no, coded as 0; kinda, coded as 0.5; or yes, coded as 1). Although a three-point scale is not optimal for factor analyses, pilot testing suggested that it was critical in allowing children to move fast enough through the study to answer all questions, and maintaining this within-subjects design was our top priority for the planned analyses.

See the Methods section for each study for details of the particular target entities and mental capacities included in each study, as well as the materials and physical setup.

Primary analysis: Exploratory factor analysis (EFA)

Our primary goal in conducting these studies was to uncover a set of latent constructs that might plausibly have given rise to the observed correlations among mental capacity attributions in each group of participants. As such, our primary planned analysis for all studies was an exploratory factor analysis (EFA). Following Weisman et al. (2017), we interpreted each of the constructs (“factors”) as corresponding to a fundamental component of mental life, according to this group of participants; by extension, we consider the full set of factors for each sample to represent to the overall “conceptual structure” underlying mental capacity attributions for this group of participants.

For all EFAs, we used ordinary least squares to find the minimum residual solution, using the “psych” package for R (Revelle, 2018). Here we focus on results using Pearson correlations using pairwise complete observations. (See Online Supplementary Materials [OSM] for solutions using polychoric correlations, which are better suited to handle responses on a three-point scale but, to our eyes, tended to over-fit our data by suggesting that we should retain many factors that each accounted for only a small amount of the shared variance.)

In order to determine how many factors to retain, we examined the results of three factor retention protocols: (1) Parallel Analysis, which compares the observed correlation structure to the correlation structure arising from random datasets of the same size; (2) Minimizing the Bayesian Information Criterion (BIC), which is one method of optimizing both goodness of fit and parsimony; and (3) A set of factor retention criteria that have been used in Weisman et al.’s (2017) previous work, in which they began with the maximal number of factors according to an analysis of degrees of freedom, and retained factors that met all three of the following criteria: (a) had eigenvalues greater than 1.00, (b) individually accounted for greater than 5% of the shared variance before rotation, and (c) were the “dominant” factor (the factor with the strongest absolute factor loading) for at least 1 mental capacity after rotation. For each study, our interpretation of how best to characterize the dataset (i.e., how many factors we observe) was determined by the degree of consensus among these three protocols and the interpretability of the retained factors under each protocol.

Here we focus our interpretations on varimax-rotated solutions, which constrain all factors to be orthogonal. (See OSM for solutions using oblique [“oblimin”] rotations, which allow for correlated factors.)

Secondary analysis: Regression analyses of factor scores

Having inferred a conceptual structure for a given group of participants via EFA, we then sought to examine attributions of mental capacities to the particular target entities included in each study within this conceptual structure: To what extent did participants attribute each of the fundamental components of mental life revealed by EFA to a given target entity, and how did this attributions vary with age (either within an age group or between age groups)? To explore this question, we examined “factor scores”—summaries of each participant’s attributions of each of factors revealed by EFA. We used the correlation-preserving “ten Berge” method (as implemented in the “psych” package; Revelle, 2018), imputing missing values using the mean (by target character, capacity, and age group). This yielded one factor score for each of the factors revealed by EFA for each participant.

We analyzed these factor scores via mixed effects Bayesian regression analyses using the “brms” package for R (Bürkner, 2017). In all of these analyses, categorical variables were effect-coded, continuous variables were centered at the mean, and we included the maximal random effect structures given the design for the relevant study. Further details varied by study, depending on the number of target entities included in that study, the number of factors revealed by EFA for the relevant group(s) of participants, and the goals of the analysis (e.g., comparing two age groups vs. examining continuous effects of age within one or more groups of participants).

Study 1

The goal of Study 1 was to develop a child-friendly version of Weisman et al.’s (2017) study paradigm and conduct an initial exploration of this conceptual structure among children.

Pilot testing suggested that children as young as 7 years of age found the paradigm easy and enjoyable, and work on the development of lay biology and psychology has suggested that these concepts may continue to develop well into middle childhood (e.g., Carey, 1985; Hatano & Inagaki, 1997; Piaget, 1929; cf. Gelman & Opfer, 2002). Thus, we targeted 7- to 9-year-old children for our first child sample. We also recruited a group of adults to validate our child- friendly paradigm, i.e., to evaluate whether it replicated Weisman et al.’s (2017) original work with adults. In Weisman et al.’s (2017) original studies, participants evaluated a target character on 40 mental capacities using a seven-point Likert-type scale. Pilot testing suggested two necessary modifications for children: rewording some of the mental capacity items, and using a simpler, three-point response scale (no, kinda, or yes; see “Overview of Methods and Analyses, above”).

Method

Participants

400 people participated in this study.

Adults (n=200) participated via Amazon Mechanical Turk (MTurk) in July 2016. Adult participants had gained approval for at least 95% of their previous work on MTurk; had MTurk accounts based in the US; and indicated that they were at least 18 years old. Adults were paid $0.30 for approximately 2-3 minutes of their time (median duration: 2.48 min).

According to self report, the adult sample ranged in age from 18-65 years (median: 31y) and was roughly split between women (47%) and men (52%; 1% of participants identified as some other gender or opted not to disclose). Adults predominantly identified as White (81%; 8% identified as more than one race/ethnicity, and \(\leq\) 4% as any other race/ethnicity). The vast majority of adults reported English being their only native language (91%; an additional 7% indicated that English was one of multiple native languages for them.)

Children (n=200) participated at one of several San Francisco Bay Area museums or at their younger sibling’s preschool between July-December 2016. The study took most children under 10 minutes to complete (median duration: 5.18 min). An additional 12 children participated but were excluded for being outside the target age range (n=7), being of unknown age (n=4), or being shown a target character other than a beetle or a robot (n=1). Children received a small thank-you gift (e.g., a sticker) for their participation.

Children ranged in age from 7.01-9.99 years (median: 8.31y). According to parental report, the child sample included slightly more girls (56%) than boys (42%; 2% of children’s gender was non-binary or unknown). Parents predominantly identified their children as White (32%), multiracial (12%), East Asian (12%), or South Asian (10%; \(\leq\) 8% of children were identified as any other race/ethnicity, and 22% of children’s race/ethnicity was unknown). Roughly half of parents (46%) reported that their child was bilingual (though, anecdotally, parents’ interpretations of “bilingual” ranged from taking classes at school to speaking a langauge at home).

Materials and procedure

Following Weisman et al. (2017, Studies 1-3), participants were randomly assigned to assess the mental capacities of one of two “edge cases” in social reasoning: a beetle (n=98 adults, n=104 children) or a robot (n=102 adults, n=96 children). Because beetles are animals and robots are artifacts, this pair provides insight into the role of biological life in attributions of mental life—an issue of particular interest from a developmental perspective, given the long history of work on the development of the animate-inanimate distinction and its relation to folk psychology. Most critically for our bottom-up approach to uncovering conceptual structure, the “mental lives” of these entities are controversial: People differ in their assessments of the mental capacities of beetles and robots. This allowed us to address the following question: When participants disagree about the mental capacities of some entity, which capacities “go together”?

Instructions to participants focused on the idea that we wanted to know what participants thought “[beetles/robots] can do and can not do.” Participants rated the target character on 40 mental capacities, presented in a random order for each participant. On each trial, participants responded no, kinda, or yes to the question “Do you think a [beetle/robot] can…?” The three response options were visible throughout the experiment.

The 40 mental capacities were designed to be as close as possible to those in Weisman et al.’s (2017) original studies, while being comprehensible to children in early elementary school. This set of items included physiological sensations related to biological needs (e.g., get hungry); emotional experiences (e.g., feel happy); perceptual abilities (e.g., hear sounds); cognitive abilities (e.g., remember things); capacities related to autonomy or agency (e.g., decide what to do); social abilities (e.g., feel guilty); and several additional items (e.g., be aware of itself). Each of these a priori categories included at least five items of varying valence, complexity, and phrasing. (See Figure 1 for the full list of mental capacities included in Study 1.)

We also prepared a short definition for each item, so as to be consistent in our responses to participants (particularly children) if they asked for clarification. Children were encouraged at the beginning of the study to ask questions if they did not know what a word meant, in which case they given these definitions; adults were told that they could access these definitions by hovering over the text on the computer screen. Pilot testing suggested that seven items required clarification for most children, so these items were always accompanied by their definitions from the beginning of the trial (for both adults and children), as follows: have a personality, like when someone is shy and somebody else is silly; have beliefs, like when you think something is true; feel pleasure, like when something feels really good; have desires, like when you really want something; have self- control, like when you stop yourself from doing something you shouldn’t do; have goals, like when you’re trying hard to do something or make something happen; and feel sick, like when you feel like you might throw up.

Adults completed the study by clicking through a website at their own pace, with one trial presented on each page and no ability to go backwards. Children completed the study on an experimenter’s laptop computer. The experimenter read the instructions and the first several trials out loud, requesting verbal responses from the child and selected his or her response for her; after several trials, the experimenter gave the child the option to continue independently (reading the questions and selecting their answers themselves) if they desired. Roughly half of participants completed the remainder of the task independently.

Data processing

We dropped trials with response times that were faster than a preset criterion of 250ms (n=3 child trials, n=97 adult trials) and retained participants regardless of skipped trials (n=55 child trials, n=1 adult trial). Overall, only 1% of adult trials and 1% of child trials were missing data; in these cases, we imputed missing values using the median by target character, capacity, and age group.

Results

Conceptual structure: Adults

Two or our three methods for determining how many factors to retain (minimizing BIC and Weisman et al.’s factor retention criteria) suggested retaining three factors. (Parallel analysis suggested retaining four factors; see SOM.)

After rotation, the first factor corresponded primarily to capacities for self- and other-relevant emotions—a suite of capacities that we (following Weisman et al.) will refer to as HEART. It was the dominant factor for such items as feel happy, feel joy, feel proud, and feel sad, and accounted for 37% of the shared variance in the rotated three-factor solution.

The second factor corresponded primarily to physiological sensations related to biological needs—a suite of capacities that we (following Weisman et al.) will refer to as BODY. It was the dominant factor for such items as feel pain, feel scared, feel tired, and get hungry, and accounted for 37% of the shared variance in the rotated three-factor solution.

The third factor corresponded primarily to perceptual-cognitive abilities to detect and use information about the environment—a suite of capacities that we (following Weisman et al.) will refer to as MIND. It was the dominant factor for such items as figure out how to do things, make choices, recognize somebody else, and sense whether something is close by or far away, and accounted for 25% of the shared variance in the rotated three-factor solution.

See Figure 1 for all factor loadings. (Note that for the sake of consistency across studies and comparison with Weisman et al.’s work, we have plotted these factors in the same order for all studies: BODY, HEART, and MIND.)

In sum, as Weisman et al.‘s original studies, a three-factor structure emerged from adults’ mental capacity attributions, characterized by a distinction between body, heart, and mind. This suggests that our child-friendly paradigm was valid: Using reworded items and a three-point response scale elicited the same intuitive ontology of mental life, among adults, that has been revealed by more complex, “adult-friendly” experimental paradigms.

Conceptual structure: Children (7-9y)

Our three methods for determining how many factors to retain all suggested retaining three factors.

After rotation, the first factor corresponded primarily to social-emotional abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ HEART factor (cosine similarity with HEART: 0.97; with BODY: 0.41; with MIND: 0.43). It was the dominant factor for such items as feel happy, feel joy, feel proud, and get hurt feelings, and accounted for 50% of the shared variance in the rotated three-factor solution.

The second factor corresponded primarily to physiological sensations. An analysis of factor congruence confirmed that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.91; with HEART: 0.26; with MIND: 0.03). It was the dominant factor for such items as feel pain, feel scared, get hungry, and smell things, and accounted for 30% of the shared variance in the rotated three-factor solution.

The third factor corresponded primarily to perceptual-cognitive abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.94; with HEART: 0.35; with BODY: 0.01). It was the dominant factor for such items as be aware of itself, be aware of things, figure out how to do things, and sense whether something is close by or far away, and accounted for 20% of the shared variance in the rotated three-factor solution. (See Figure 1 for all factor loadings.)

In sum, like adults, children’s mental capacity attributions were dominated by a three-way distinction between physiological, social-emotional, and perceptual-cognitive abilities—i.e., body, heart, and mind.

Attributions of mental life: children vs. adults

The factor analyses of correlations among mental capacity attributions just described shed light on one aspect of children’s concepts of mental life: its ontological structure. The design of our study also allows us to look at a second aspect of conceptual development in this domain: children’s application of this concept, i.e., which mental capacities they tend to attribute or not to attribute to the different target characters. How might children’s attributions of capacities related to BODY, HEART, and MIND vary across middle childhood (7-9y), and how do they compare to the mental capacity attributions of adults?

We approached this question from several angles.

First, we projected children’s responses into the factor space defined by adults (standardized in terms of adults’ responses), and examined factor scores by age group (using the correlation-preserving method articulated by ten Berge, Krijnen, Wansbeek, & Shapiro, 1999, as implemented in the “psych” package for R, Revelle, 2018). This yielded three scores for each participant, corresponding, in principle, to holistic judgments of the social-emotional, physiological, and perceptual-cognitive abilities of the target character the participant evaluated. (Note that each of these three scores takes into account factor loadings for all 40 mental capacities, as shown in Figure 1.)

This allowed us to examine the effects of age group (adult, child), character (beetle, robot), and factor (BODY, HEART, MIND) on these scores via mixed effects Bayesian regression. See Table 1 for the results of a maximal model and Figure 2 for scores by age group, age (for children), factor, and character.

Table 1: Fixed effects from a mixed-effects Bayesian regression model predicting factor scores in Study 1 by character (beetle, robot), factor (BODY, HEART, MIND), and age group (adults, children). The model used the formula 'factor score ~ factor * age group * character + (1 | subject)' and was implemented in the 'brms' package for R (Bürkner, 2017). All variables were effect-coded. Asterisks mark parameters whose 95% credible interval does not include 0.
Parameter b Error 95% CI
(Intercept) 0.30 0.03 [ 0.25, 0.36] *
character (robot vs. grand mean) -0.21 0.03 [-0.26, -0.15] *
HEART (vs. grand mean) 0.81 0.04 [ 0.73, 0.89] *
MIND (vs. grand mean) -0.56 0.04 [-0.64, -0.48] *
age group (children vs. grand mean) 0.30 0.03 [ 0.24, 0.35] *
character × HEART 0.24 0.04 [ 0.16, 0.32] *
character × MIND 0.38 0.04 [ 0.30, 0.46] *
character × age group 0.04 0.03 [-0.01, 0.10]
HEART × age group 0.82 0.04 [ 0.74, 0.90] *
MIND × age group -0.55 0.04 [-0.63, -0.47] *
character × HEART × age group -0.02 0.04 [-0.10, 0.06]
character × MIND × age group -0.04 0.04 [-0.11, 0.04]

Collapsing across age groups and factors, factor scores suggest that participants generally attributed fewer mental capacities to the robot than the beetle (b = -0.21, 95% credible interval: [-0.26, -0.15]). However, this appears to be entirely due to the huge discrepancy between characters in the BODY domain; the difference between characters was reduced to nothing in the HEART domain (b = 0.24, 95% credible interval: [0.16, 0.32]), and reversed in the perceptual-cognitive domain (b = 0.38, 95% credible interval: [0.30, 0.46]). Collapsing across target characters, children tended to attribute more mental capacities adults (b = 0.30, 95% credible interval: [0.24, 0.35]), but this was driven primarily by the social-emotional domain (b = 0.82, 95% credible interval: [0.74, 0.90]), and was reversed in the perceptual-cognitive domain (b = -0.55, 95% credible interval: [-0.63, -0.47]).

A visual inspection of Figure 2 clarifies these findings. Attributions in the BODY and MIND domains were rather similar for children and adults: Both children and adults marked a clear difference between the robot and the beetle in the physiological sensations of the BODY (left), in line with the animate–inanimate distinction; and both age groups credited the robot with slightly greater perceptual-cognitive skills (MIND) than the beetle (right). In contrast, in the HEART domain (center) both the beetle and the robot received rather low scores among adults, but very high scores among children.

The raw data further supporst these observations. (See Figure 3 for raw counts of no, kinda, and yes responses for all items, grouped by factor, character, and age group.) For example, consider hunger (the first capacity under BODY): Across age groups, nearly every participant said that a beetle could get hungry, while few participants (with the exception of some children) said that a robot could. Likewise, for mathematical computations (the last capacity under MIND), virtually no participants said that a beetle was capable of doing math, while the vast majority of both adults and children said that a robot was. But for social-emotional abilities, like feeling proud, feeling joy, and feeling sad (the first three capacities under HEART), far more children than adults endorsed these capacities for beetles and robots. (See SOM for an analysis, parallel to the regression analyses here, of the proportion of the top-loading mental capacities for each factor that were endorsed by participants of different ages.)

Using alpha for a discrete variable is not advised.

Of course, our sample of “children” included participants as young as 7 years and up to nearly 10 years of age. How did attributions vary across this age range? A visual inspection of Figure 2 suggests that, across all three domains (BODY, HEART, and MIND), children’s mental capacity attributions to beetles and robots appeared to become more adult-like with age—but while the oldest children were indistinguishable from adults in the BODY and MIND domains, even the oldest children appear to have attributed more social-emotional abilities to these entities than most adults did.

A separate regression on children’s factor scores alone confirmed that, while collapsing across factors and target characters children’s overall mental capacity attributions did not vary with age (b = -0.08, 95% credible interval: [-0.18, 0.03]), relative to the grand mean attributions of HEART decreased with age (b = -0.41, 95% credible interval: [-0.56, -0.27]) and attributions of MIND increased with age (b = 0.35, 95% credible interval: [0.21, 0.50]). (See Table 2 for the full results of this model.)

Table 2: Fixed effects from a mixed-effects Bayesian regression model predicting factor scores in Study 1 by character (beetle, robot), factor (BODY, HEART, MIND), and exact age group (for children only). The model used the formula 'factor score ~ factor * age * character + (1 | subject)' and was implemented in the 'brms' package for R (Bürkner, 2017). All categorical variables were effect-coded, and age was mean-centered. Asterisks mark parameters whose 95% credible interval does not include 0.
Parameter b Error 95% CI
(Intercept) 0.60 0.04 [ 0.51, 0.69] *
character (robot vs. grand mean) -0.16 0.04 [-0.25, -0.08] *
HEART (vs. grand mean) 1.63 0.06 [ 1.50, 1.75] *
MIND (vs. grand mean) -1.10 0.06 [-1.22, -0.98] *
age (mean-centered) -0.08 0.05 [-0.18, 0.03]
character × HEART 0.21 0.06 [ 0.09, 0.33] *
character × MIND 0.35 0.06 [ 0.23, 0.47] *
character × age -0.09 0.05 [-0.20, 0.01]
HEART × age -0.41 0.08 [-0.56, -0.27] *
MIND × age 0.35 0.07 [ 0.21, 0.50] *
character × HEART × age -0.08 0.07 [-0.23, 0.06]
character × MIND × age 0.06 0.08 [-0.09, 0.21]

Taken together, these analyses converge to suggest only minor differences between children and adults in their attributions of BODY and MIND to beetles and robots—but a major difference in HEART: Relative to adults, children tended to credit both beetles and robots with much greater social-emotional abilities.

Discussion

Study 1 shed light on two distinct aspects of the development of children’s concpetual representations of mental life: continuity in the underlying conceptual structure and variabilty in the application of these concepts.

On the one hand, exploratory factor analyses suggested that by midddle childhood (7-9y), the conceptual structure underlying US children’s attributions of mental life is very similar to that of US adults, anchored by suites of mental capacities related to BODY (physiological sensations), HEART (social-emotional abilities), and MIND (perceptual-cognitive abilities). We note that, in principle, a number of additional or alternative latent factors could have emerged from the factor analysis of children’s responses. For example, children might have distinguished primarily between internal experience and external action (Gray et al., 2007), or they might have demonstrated finer-grained groupings of mental capacities based on phrasing, rote knowledge, etc. Instead, the latent conceptual structure underlying children’s responses appears to be very similar to that of adults, both in this study and in Weisman et al.’s (2017) previous work. In other words, any dramatic developmental changes to this conceptual structure likely occur prior to the age of 7 years.

On the other hand, analyses of children’s attributions within this shared conceptual structure suggested that their application of this concept—in particular, their attributions of the social-emotional abilities of the HEART—may be undergoing continuing refinement through middle childhood. The specificity of this age difference—which emerged dramatically in one domain (HEART), but not others (BODY, MIND)—suggests that this is unlikely to be due either to a general tendency toward “mentalizing” these characters (or a simple “yes” bias). But its extension to both beetles and robots raises many questions. With regard to robots, children growing up in the 21st century might be converging on a new understanding of technological “beings” as inanimate objects with some degree of social-emotional life (see Kahn, Gary, & Shen, 2013)—but this kind of historical conceptual change would not predict the high rates of social-emotional attributions to beetles that we observed. Our findings are perhaps more consistent with a general openness to untraditional social partners that extends into middle childhood (but not adulthood)—or with a difference in construals of what it means to feel proud, happy, guilty, etc. To what kinds of entities would children of this age deny social-emotional abilities, and how do they draw this line? How would younger children’s attributions of HEART (as well as BODY and MIND) compare?

Study 2

The goals of Study 2 were twofold.

First, we aimed to extend our findings with 7- to 9-year-old children in Study 1, by expanding the list of the target characters to include not only the two “edge cases” from Study 1 (a beetle and a robot), but a also a wider range of animate beings (a bird, a goat, and an elephant) and inanimate objects (a computer, a teddy bear, and a doll). In Weisman et al.’s original studies, this approach yielded a highly similar conceptual structure to the “edge case” approach (Weisman et al., 2017; Study 4). We reasoned that if this three-part conceptual structure is stable and robust by the age of 7-9 years, it should manifest among 7- to 9-year-old children under the same range of conditions that elicit this structure from adults.

Second, we aimed to assess the earlier development of this conceptual structure in a group of younger children. We targeted 4- to 6-year-old children for our younger age group because this has been identified as a period of dramatic development in several relevant domains. Many studies have documented shifts in children’s abilities to take others’ perspectives, represent false beliefs, and integrate representations of intentions and outcomes in evaluating moral responsibility (for reveiws, see Flavell, 1999; Wellman, 2015). The preschool years have also been the focus of a rich tradition of work on lay biology and the animate-inanimate distinction extending back nearly a century (e.g., Carey, 1985; R. Gelman, Spelke, & Meck, 1983; Medin, Waxman, Woodring, & Washinawatok, 2010; Piaget, 1929; for a review, see S. Gelman & Opfer, 2002). All of these accounts make the case that becoming a sophisticated reasoner—and particularly a sophisticated social reasoner—requires substantial refinement of one’s representations of others’ experiences, beliefs, desires, and needs. Might these refinements include shifts in children’s intuitions about the fundamental components of mental life?

Pilot testing suggested that working with younger children would require making a briefer experimental paradigm with fewer than the 40 questions included in Study 1; limiting the list to 20 questions seemed to allow children as young as 4 years of age to complete the study easily and without getting bored or frustrated, while still including enough items to enable us to proceed with our exploratory “dimensionality reduction” approach to uncovering conceptual structure.

To validate this modified paradigm, we also included a sample of adults.

Method

Participants

241 people participated in this study.

Adults (n=116) participated via Amazon Mechanical Turk (MTurk) in September 2018. Adult participants had gained approval for at least 95% of their previous work on MTurk; had MTurk accounts based in the US; and indicated that they were at least 18 years old. Adults were paid $0.45 for approximately 2-4 minutes of their time (median duration: 3.02 min). An additional 22 adults participated but were excluded for failing to respond sensibly to an open-ended question about what they had been asked to do in the study (e.g., copying and pasting text from the question, writing “good study,” or describing a different study, e.g., “I wrote an essay about nature”; n=11) or for failing to pass one or more attention checks (e.g., “Please select no”; n=11). According to self report, the final adult sample ranged in age from 20-69 years (median: 38y) and included slightly more men (53%) than women (47%). Adults predominantly identified as White (84%; 2% identified as more than one race/ethnicity, and \(\leq\) 4% as any other race/ethnicity).

Data collection with children occurred between January-June 2017. For our factor analyses we grouped children into two age groups, because EFA is a group-level analysis of the consensual conceptual structure and is not designed to model continuous participant-level variables like exact age. Our goal with these analyses was to examine discrete “snapshots” of this conceptual structure at two points in this continuous developmental trajectory. Our planned sample size was 120 older and 120 younger children, but we also retained a handful of extra participants who completed the study on the final day of data collection for each group.

The group that we will refer to as “older children” (n=125) ranged in age from 7.08-9.98 years (median: 8.56y), and participated at one of several San Francisco Bay Area museums or at their younger sibling’s preschool between July-December 2016. The study took most children under 10 minutes to complete (median duration: 2.70 min). According to parental report, the sample of older children included slightly more boys (45%) than girls (54%; 1% of children’s gender was non-binary or unknown). Parents predominantly identified their children as White (30%), South Asian (14%, multiracial (11%), or East Asian (10%); \(\leq\) 7% of children were identified as any other race/ethnicity, and 22% of children’s race/ethnicity was unknown).

“Younger children” (n=124) ranged in age from 4.00-6.98 years (median: 5.03y), and participated either at their preschool or at a museum; the median study duration for this group was 3.58 min. According to parental report and school records, the sample of younger children included roughly the same numbers of girls (48%) and boys (52%). Children were predominantly identified as multiracial (46%) or White (28%; \(\leq\) 6% of children were identified as any other race/ethnicity, and 5% of children’s race/ethnicity was unknown).

An additional 7 children participated but were excluded for being outside the target age ranges. Children received a small thank-you gift (e.g., a sticker) for their participation.

Materials and procedure

Participants were assigned to evaluate one of the following target entities: an elephant, a goat, a mouse, a bird, a beetle, a teddy bear, a doll, a robot, or a computer (n=XX-XX per character, per age group). This allowed us to address the following question: When target entities are perceived to vary in their mental capacity profiles, which capacities “go together”?

Participants were assigned to target characters randomly, with two exceptions: The doll and teddy bear conditions were run last for older children (but included in the initial randomization scheme for adults and younger children); and toward the end of data collection children were assigned to conditions that had the fewest participants. As in Study 1, a vivid, high-resolution photo of the target character in a naturalistic context was visible for the duration of the study.

Instructions were identical to Study 1. Participants rated the target character on 20 mental capacities, presented in a random order for each participant. On each trial, participants responded no, kinda, or yes to the question “Do you think a [beetle] can…?” As in Study 1, adults completed the study by clicking through a website at their own pace, with one trial presented on each page and no ability to go backwards, and children completed the study on an experimenter’s laptop computer. Following Study 1, for older children the experimenter read the instructions and the first several trials out loud, requesting verbal responses from the child and selected his or her response for her; after several trials, the experimenter gave the child the option to continue independently if they desired. All younger children heard all questions read aloud by the experimenter and responded verbally.

The 20 mental capacities were a subset of the 40 items used in Study 1, chosen to include physiological sensations, emotional experiences, perceptual abilities, cognitive skills, capacities related to autonomy or agency, and social abilities; and to include some of the strongest-loading items for each of the three factors uncovered among adults in Study 1 (see Figure 1). As in Study 1, each mental capacity was associated with a short, preset definition. Both older and younger children were encouraged at the beginning of the study to ask questions if they did not know what a word meant, in which case they were given these definitions. (Adults did not have access to these definitions.)

After asking the 20 quesitons about mental capacities, for a subset of participants we also asked two additional questions: “Is a [target] made out of metal?” and “Can a [target] be turned on and off?” See SOM for an analysis of responses to these questions.

Data processing

We planned to drop trials with response times that were faster than a preset criterion of 250ms, but there were none among children, and we failed to record response times among adults. As in Study 1, we retained participants regardless of skipped trials (n=0 trials among older children and adults, 30 trials among younger children). Overall, none of adults or older children’s trials, and only 1.21% of younger children’s trials, were missing data.

Results

Conceptual structure: Adults

As in Study 1, two or our three methods for determining how many factors to retain (in this case, parallel analysis and Weisman et al.’s factor retention criteria) suggested retaining three factors. (Minimizing BIC suggested retaining four factors; see SOM.)

As expected, the conceptual structure revealed by this analysis among adults was characterized by a three-way distinction between BODY (first factor, 38% of the shared variance in the rotated three-factor solution), HEART (first factor, 33% of shared variance), and MIND (first factor, 29% of shared variance). (See Figure 4, Panel D.)

This suggests that our modified child-friendly paradigm was valid: Using a shorter list of items and a wider range of target characters elicited the same intuitive ontology of mental life, among US adults, that was revealed in Study 1 and in Weisman et al.’s previous work.

Conceptual structure: Older children (7-9y)

Our three methods for determining how many factors to retain all suggested retaining three factors.

As in Study 1, the conceptual structure revealed by this analysis among 7- to 9-year-old children was very similar to that of adults, again characterized by a three-way distinction between BODY, HEART, and MIND.

After rotation, the first factor corresponded primarily to physiological sensations. An analysis of factor congruence confirmed that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.97; with HEART: 0.65; with MIND: 0.63). It was the dominant factor for such items as feel pain, feel scared, get hungry, and smell things, and accounted for 39% of the shared variance in the rotated three-factor solution.

The second factor corresponded primarily to social-emotional abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ HEART factor (cosine similarity with HEART: 0.98; with BODY: 0.66; with MIND: 0.48). It was the dominant factor for such items as feel embarrassed, feel guilty, feel proud, and feel sad, and accounted for 35% of the shared variance in the rotated three-factor solution.

The third factor corresponded primarily to perceptual-cognitive abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.96; with HEART: 0.47; with BODY: 0.62). It was the dominant factor for such items as figure out how to do things, make choices, remember things, and sense temperatures, and accounted for 26% of the shared variance in the rotated three-factor solution. (See Figure 4, Panel C, for all factor loadings.)

We consider this to be a close conceptual replication of our Study 1 findings, suggesting that by the age of 7-9 years, this three-part conceptual structure is stable and robust to a range of experimental conditions.

Conceptual structure: Younger children (4-6y)

Our three methods for determining how many factors to retain each suggested retaining different numbers of factors: Weisman et al.’s factor retention criteria suggested retaining three factors, parallel analysis suggested retaining two factors, and minimizing BIC suggested a null, one-factor solution. Here we present both the two- and three-factor solutions. (See SOM for factor loadings on the one “factor” in the null, one-factor solution.)

Three-factor solution

In the rotated three-factor solution suggested by Weisman et al.‘s retention criteria, the first factor corresponded primarily to physiological sensations, as well as some positive emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.92), but was also quite similar to adults’ HEART factor (cosine similarity with HEART: 0.81; with MIND: 0.7). It was the dominant factor for such items as feel tired, get angry, get hungry, and get hurt feelings, and accounted for 40% of the shared variance in the rotated three-factor solution.

The second factor corresponded primarily to perceptual-cognitive abilities, as well as one complex negative emotion (feel guilty). An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.94; with HEART: 0.67; with BODY: 0.71). It was the dominant factor for such items as feel guilty, figure out how to do things, remember things, and sense temperatures, and accounted for 30% of the shared variance in the rotated three-factor solution.

The third factor corresponded primarily to social-emotional abilities, with particularly strong loadings for positive emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ HEART factor (cosine similarity with HEART: 0.87), but also quite similar to adults’ BODY factor (cosine similarity with BODY: 0.81; with MIND: 0.62). It was the dominant factor for such items as feel happy, feel love, feel proud, and feel scared, and accounted for 30% of the shared variance in the rotated three-factor solution. (See Figure 4, Panel B, for all factor loadings.)

Two-factor solution

In the rotated two-factor solution suggested by parallel analysis, the first factor encompassed both physiological sensations and emotions. An analysis of factor congruence indicated that this factor was most similar to adults’ BODY factor (cosine similarity with BODY: 0.93), but was also quite similar to adults’ HEART factor (cosine similarity with HEART: 0.88; with MIND: 0.7). It was the dominant factor for such items as feel happy, feel sick, get angry, and get hungry, and accounted for 65% of the shared variance in the rotated two-factor solution.

The second factor corresponded primarily to perceptual-cognitive abilities. An analysis of factor congruence confirmed that this factor was most similar to adults’ MIND factor (cosine similarity with MIND: 0.94; with HEART: 0.73; with BODY: 0.73). It was the dominant factor for such items as feel guilty, remember things, sense temperatures, and sense whether something is close by or far away, and accounted for 35% of the shared variance in the rotated three-factor solution. (See Figure 4, Panel A, for all factor loadings.)

BOOKMARK

BOOKMARK

Discussion

XX

Study 3

The primary goal of Study 3 was to (conceptually) replicate and extend our findings with 4- to 6-year-old children in Study 2. In light of the concerns about vocabulary, attention, and use of the response scale among younger children in Study 2, we designed an even more child-friendly version well suited for young preschoolers, streamlining the experimental protocol, providing more scaffolding for the response scale, and including only vocabulary items that were pre-tested to be familiar to young preschool children (see “Method”).

A second goal of Study 3 was to assess younger children’s attributions of mental life to edge cases. Recall that, in Study 1, older children attributed more social-emotional abilities (“heart”) to both beetles and robots than did adults, despite sharing adults’ three-part conceptual structure; this “edge case” approach of Study 1 allowed us to estimate older children’s aggregate attributions to these entities with precision and to chart changes in these attributions over age continuously within the range of 7-9 years, because large numbers of children assessed each of the two target entities (rather than participants being distributed across a wider range of target entities). In Study 3, we returned to this approach, limiting the target characters to a beetle and a robot, so as to follow up on this secondary finding with a younger group of children.

Finally, Study 3 was designed in anticipation of developing participant-level analyses to supplement the group-level EFAs discussed so far (see “Continuous development at the participant level: A re-analysis of Studies 1-3,” below). With this general goal in mind, we asked each child to assess the mental capacities of both a beetle and a robot, so as to maximize the number of observations per participant for these anticipated participant-level analyses.

Method

Participants

XX people participated in this study.

Adults (n=XX) participated via Amazon Mechanical Turk (MTurk) in September 2018. Adult participants had gained approval for at least 95% of their previous work on MTurk; had MTurk accounts based in the US; and indicated that they were at least 18 years old. Adults were paid $0.75 for approximately XX minutes of their time (median duration: XX min). An additional XX adults participated but were excluded for failing to pass one or more attention checks (e.g., “Please select no”; n=XX) or for failing to respond sensibly to an open-ended question about what they had been asked to do in the study (see Study 3 for examples; n=XX).

Among the final sample of XX adults, XX% identified as women and XX% as men. Adults predominantly identified as White (XX%; XX% as Black, XX% as Asian; XX% as XX), and reported being between XX and XX years of age (median age: XX years). XX OTHER DEMOGRAPHICS: Native language, education, religion as a child, religion now, job. XX children participated in this study, which was conducted between January 2018 and XX 2018. Our planned sample size was 100 children, but we also retained a handful of extra participants who completed the study on the final days of data collection. Children ranged in age from 4.00-XXy (median: XXy), and participated at their preschool; exact duration was not recorded, but the full study session generally took less than 10 minutes. According to school records, XX children (XX%) were girls and XX (XX%) were boys; for XX children (XX) gender was either non-binary or unknown. Parents predominantly identified their children as White (XX%) or Asian (XX%; XX% as Black, XX% as Asian; XX% as XX). XX OTHER DEMOGRAPHICS.

An additional XX children participated but were excluded for being outside the target age range.

Materials and procedure

Materials and procedure were adapted to be more appropriate for young preschoolers, with two primary goals in mind: Streamlining the experimental protocol to improve children’s comprehension and attention to the task, and limiting mental capacities to words that are highly familiar to young preschool children.

In order to streamline the experimental protocol, we moved the task off of the computer (for children but not adults), instead using printed photographs of the target entities (measuring approximately 5 x 8 inches, printed in color and laminated) and recording children’s responses by hand (rather than using the computer). At the time of testing, the experimenter and child sat side by side, with the photograph placed directly in front of the child for the duration of the task.

We also streamlined the introduction to the task. The experimenter began by placing the photograph of the first target entity in front of the child and asking, “Can you tell me what this is?” If a child provided an answer other than “beetle” or “robot,” the experimenter said, “I’m going to call it a [beetle/robot].” Then the experimenter said, “We’re going to play a game about [beetles/robots],” reminded children, “if you ever want to stop playing, you can just let me know and we’ll go back to the classroom” (per preschool protocol), and then launched into the first question (e.g., “Can beetles get sad?”).

We scaffolded children’s use of the three-point response scale by providing a physical representation of the scale, consisting of three large boxes, separated by blank space, containing the words NO, KINDA, and YES written in large font with all capital letters (to aid children with at least some reading skills in recognizing these words); color-coded according to the intensity of response (NO = very light blue, KINDA = medium blue, YES = dark blue); and ordered from left (NO) to right (YES). Each box measured approximately 2 x 4 inches; the boxes were laminated with slightly less than 1 inch of empty space between them (through which the table was visible). In addition to providing these visual and spatial cues to the fact that there were three response options—no, yes, and something conceptually and literally “in between” these extremes—we also added a line to the experimenter’s script describing (and then reiterating) these response options on the first three trials (“You can say no [pointing to NO], kinda [pointing to KINDA], or yes [pointing to YES]”). The experimenter repeated these options on the first three trials for all children, and on any other trials where a child took more than a few seconds to answer or provided a response other than saying “yes,” “kinda,” or “no” or clearly pointing to one of these options on the response scale.

For each target entity, children answered 18 questions about its mental capacities. These questions were designed to include six clear examples of bodily, social-emotional, and perceptual-cognitive abilities, according to Studies 1-2 and Weisman et al.’s (2017) original studies with US adults. Bodily abilities included feel hungry, get thirsty, feel sick, feel tired, get scared, and smell things. Social-emotional abilities included love someone, hate someone, feel happy, get sad, feel sorry, get lonely. Perceptual-cognitive abilities included see, hear, think, remember things, know stuff, figure things out. These items were chosen to as short as possible and highly familiar to young preschool children; they were selected from a larger pilot study in which we asked 3- to 5-year-old children to complete stories that began with each of these mental capacities as a premise (e.g., “Let’s imagine a person who loves someone. What happens next?”; “Now let’s pretend that someone remembers something. What happens next?”) and judged the appropriateness of their story completion. We further designed the set of items so that each category included a variety of phrasings (e.g., feel hungry vs. get thirsty; remember things vs. know stuff) and valences when appropriate (e.g., feel happy vs. get sad); when possible, we aimed to have phrasings vary orthogonally with categories, such that “get” and “feel” appeared roughly equally often among the bodily and social-emotional items, and “things” appeared equally often among the bodily and perceptual-cognitive items. As in Studies 1-2, each mental capacity was associated with a short, preset definition, which was read to children if they expressed uncertainty about what a word meant or did not respond after prompting use of the response scale.

Children first assessed all 18 mental capacities for one of the target characters (e.g., the beetle), then completed an easy jigsaw puzzle featuring clothing and accessories appropriate for a rainy day (which took about 30-60 second to complete), and finally assessed all 18 mental capacities for the other target character (e.g., the robot).

This modified procedure—particularly moving the experiment off of the computer for children—required changes to the experimental design. Rather than randomly assigning children to assess the beetle first or the robot first, the order of target entities was counterbalanced in advance. Likewise, rather than asking about the 18 mental capacities in a random order, questions about the first target entity were asked in one of 8 pre-made random orders, and questions about the second target entity were asked in the reverse order. The order of the target entities (beetle-robot or robot-beetle) and the order of the mental capacity questions (1-8) were fully crossed across participants.

Adults participated in an online version of this same task, without a break between target characters. As in Studies 1 and 2, adults clicked through a website at their own pace, with one trial presented on each page and no ability to go backwards.

Data processing

We did not record response times or use this as a criterion for inclusion. As in Studies 1-2, we retained participants regardless of skipped trials (n=XX trials; XX% of all trials).

Results

XX

Discussion

XX

General Discussion

Summary

The current studies suggest that children’s conceptual representations of mental life undergo substantial development between the ages of 4-9 years—in two distinct senses.

First, analyses of the correlational structure of children’s mental capacity attributions (EFAs) suggested changes in conceptual structure: Between early childhood (4-6 years; Studies 2-3) and middle childhood (7-9 years; Studies 1-2), children’s sense of which mental capacities “go together” seemed to unfold into a higher-dimensional space, characterized by stronger differentiation of the social-emotional abilities that we’ve called “heart” from the physiological sensations of the body and the perceptual-cognitive abilities of the mind. Meanwhile, analyses of factor scores—summaries of which mental capacities children tended to attribute to which target entities—revealed a second kind of age-related difference: what we might call changes in the application of the concept. These differences were clearest in Studies 1 and 3, which focused on two “edge cases” in social reasoning (beetles and robots): Between the ages of 4-6 years (Study 3), XX FILL IN, while between the ages of 7-9 years (Study 1), attributions of body to beetles and robots were relatively stable and adult-like, attributions of heart to these “edge cases” started out higher than adults and decreased to nearly adult-like levels by the age of 9 years, and attributions of mind started out lower than adults and increased to nearly adult-like levels by the age of 9 years.

XX GD

LS0tCnRpdGxlOiAnQ2hpbGRyZW4nJ3MgZGV2ZWxvcGluZyByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmU6IENoYW5nZXMgaW4gY29uY2VwdHVhbAogIHN0cnVjdHVyZSBiZXR3ZWVuIDQtOSB5ZWFycyBvZiBhZ2UnCmF1dGhvcjogIkthcmEgV2Vpc21hbiwgQ2Fyb2wgUy4gRHdlY2ssICYgRWxsZW4gTS4gTWFya21hbiIKc3VidGl0bGU6IERyYWZ0IHVwZGF0ZWQgMjAxOC0wOS0xNwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAwLjY3LCAKICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBGLCBlY2hvID0gRikKYGBgCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobGFuZ2NvZykgIyBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5nY29nL2xhbmdjb2ctcGFja2FnZQojIGxpYnJhcnkobG1lNCkKbGlicmFyeShicm1zKQpsaWJyYXJ5KHN0cmluZ2kpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShrYWJsZUV4dHJhKQoKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCmBgYAoKYGBge3J9CiMgc3VwcG9ydGluZyBmdW5jdGlvbnMKc291cmNlKCIuL3NjcmlwdHMvbWF4X2ZhY3RvcnNfZWZhLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9yZXRlbl9mdW4uUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Bsb3RfZnVuLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9lZmFfZnVuLlIiKQoKIyBkYXRhIHNjcmlwdHMKc291cmNlKCIuL3NjcmlwdHMvZGF0YV9zMV9hZC5SIikKc291cmNlKCIuL3NjcmlwdHMvZGF0YV9zMV83OS5SIikKc291cmNlKCIuL3NjcmlwdHMvZGF0YV9zMl9hZC5SIikKc291cmNlKCIuL3NjcmlwdHMvZGF0YV9zMl83OS5SIikKc291cmNlKCIuL3NjcmlwdHMvZGF0YV9zMl80Ni5SIikKCiMgZnVuY3Rpb24gZm9yIHF1aWNrbHkgZ2V0dGluZyBjb3VudHMgYW5kIHByb3BvcnRpb25zIGZvciBjYXRlZ29yaWNhbCBkZW1vIHZhcmlhYmxlcwpkZW1vX2Z1biA8LSBmdW5jdGlvbihkZiwgdmFyLCBuX3JvdW5kID0gTkEpewogIG5ld19kZiA8LSBkZiAlPiUKICAgIGRpc3RpbmN0Xygic3ViaWQiLCB2YXIpICU+JQogICAgbXV0YXRlX2F0KC52YXJzID0gdmFyLAogICAgICAgICAgICAgIC5mdW5zID0gLiAlPiUgYXMuY2hhcmFjdGVyKCkgJT4lIHJlcGxhY2VfbmEoLiwgIk1JU1NJTkciKSkgJT4lCiAgICBjb3VudF8odmFyKSAlPiUKICAgIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogICAgYXJyYW5nZShkZXNjKG4pKQogIGlmKCFpcy5uYShuX3JvdW5kKSl7CiAgICBuZXdfZGYgPC0gbmV3X2RmICU+JSBtdXRhdGUocHJvcCA9IHJvdW5kKHByb3AsIG5fcm91bmQpKQogIH0KICByZXR1cm4obmV3X2RmKQp9CgojIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHdyaXRlLXVwIG9mIGJybXMgbW9kZWwgcmVzdWx0cwp3cml0ZV9iXzk1Q0lfZnVuIDwtIGZ1bmN0aW9uKG1vZGVsLCBwYXJhbSwgcm91bmRfbiA9IDIpewogIGZpeGVmIDwtIGZpeGVmKG1vZGVsKSAlPiUgcm91bmQocm91bmRfbikgJT4lIGZvcm1hdChuc21hbGwgPSByb3VuZF9uKQogIGIgPC0gZml4ZWZbcGFyYW0sICJFc3RpbWF0ZSJdCiAgbG93ZXIgPC0gZml4ZWZbcGFyYW0sICJRMi41Il0KICB1cHBlciA8LSBmaXhlZltwYXJhbSwgIlE5Ny41Il0KICB0ZXh0IDwtIHBhc3RlMCgiX2JfID0gIiwgYiwgCiAgICAgICAgICAgICAgICAgIiwgOTUlIGNyZWRpYmxlIGludGVydmFsOiBbIiwgbG93ZXIsICIsICIsIHVwcGVyLCAiXSIpCiAgdGV4dCA8LSBnc3ViKCJcXFsgIiwgIlxcWyIsIHRleHQpCiAgcmV0dXJuKHRleHQpCn0KYGBgCgpgYGB7cn0KIyB3aGF0IGNvcnJlbGF0aW9uIHRvIHVzZQpjaG9zZW5fY29yIDwtICJjb3IiICMgcmVwb3J0ZWQKIyBjaG9zZW5fY29yIDwtICJwb2x5IiAjIGFsdGVybmF0aXZlIG9wdGlvbgoKIyB3aGF0IHJvdGF0aW9uIHRvIHVzZQpjaG9zZW5fcm90IDwtICJ2YXJpbWF4IiAjIHJlcG9ydGVkCiMgY2hvc2VuX3JvdCA8LSAib2JsaW1pbiIgIyBhbHRlcm5hdGl2ZSBvcHRpb24KCiMgd2hhdCBmYWN0b3JpbmcgbWV0aG9kIHRvIHVzZQpjaG9zZW5fZm0gPC0gIm1pbnJlcyIgIyByZXBvcnRlZCAoc2VlIGFsdGVybmF0aXZlIG9wdGlvbnMgaW4gP2ZhKQoKIyB3aGF0IHNjb3JpbmcgbWV0aG9kIHRvIHVzZQpjaG9zZW5fc2NvcmVzIDwtICJ0ZW5CZXJnZSIgIyByZXBvcnRlZAojIGNob3Nlbl9zY29yZXMgPC0gInJlZ3Jlc3Npb24iICMgYWx0ZXJuYXRpdmUgb3B0aW9uCmBgYAoKIyBBYnN0cmFjdAoKWFgKCiMgSW50cm9kdWN0aW9uCgpYWAoKSW4gdGhpcyBwYXBlciwgd2UgZmlyc3QgaW50cm9kdWNlIGEgY2hpbGQtZnJpZW5kbHkgdmVyc2lvbiBvZiBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBleHBlcmltZW50YWwgcGFyYWRpZ20sIHZhbGlkYXRlIGl0IGFtb25nIFVTIGFkdWx0cywgYW5kIHRoZW4gdXNlIHRoaXMgcGFyYWRpZ20gdG8gY29uZHVjdCBhbiBpbml0aWFsIGV4cGxvcmF0aW9uIG9mIHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgYW5kIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgYW1vbmcgVVMgY2hpbGRyZW4sIGZvY3VzaW5nIG9uIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gKFN0dWR5IDEpLiBOZXh0LCB3ZSByZXBsaWNhdGUgb3VyIGZpbmRpbmdzIHdpdGggNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiB1c2luZyBhIGJyaWVmZXIgZXhwZXJpbWVudGFsIHBhcmFkaWdtLCBhbmQgdXNlIHRoaXMgYnJpZWZlciBwYXJhZGlnbSB0byBhc3Nlc3MgdGhlIGVhcmxpZXIgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSwgZm9jdXNpbmcgb24gNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiAoU3R1ZHkgMikuIFdlIHRoZW4gZGV2ZWxvcCBhbiBldmVuIHNpbXBsZXIgdmVyc2lvbiBvZiB0aGUgcGFyYWRpZ20sIHVzaW5nIG1vcmUgYmFzaWMgdm9jYWJ1bGFyeSBhbmQgYSBzdHJlYW1saW5lZCBleHBlcmltZW50YWwgcHJvdG9jb2wsIHdpdGggdGhlIGFpbSBvZiB2YWxpZGF0aW5nIGFuZCByZWZpbmluZyBvdXIgdW5kZXJzdGFuZGluZyBvZiBjb25jZXB0dWFsIHN0cnVjdHVyZSBhbW9uZyA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuLCBhcyB3ZWxsIGFzIGV4cGxvcmluZyBob3cgeW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBkaWZmZXJlbnQgYXNwZWN0cyBvZiBtZW50YWwgbGlmZSBtaWdodCB2YXJ5IHdpdGggYWdlIChTdHVkeSAzKS4gRmluYWxseSwgdG8gc3VwcGxlbWVudCB0aGUgZ3JvdXAtbGV2ZWwgYW5hbHlzZXMgcGljdHVyZSBvZiBkZXZlbG9wbWVudCBwcm92aWRlZCBieSB0aGUgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2VzIGZvciBTdHVkaWVzIDEtMywgd2UgcmUtYW5hbHl6ZSB0aGVzZSBkYXRhIHVzaW5nIGEgbm92ZWwsIHBhcnRpY2lwYW50LWxldmVsIGFwcHJvYWNoIHRoYXQgYWxsb3dzIHVzIHRvIG9ic2VydmUgaG93IHRoZXNlIGNvbmNlcHR1YWwgc3RydWN0dXJlcyBtaWdodCBldm9sdmUgYW5kIHVuZm9sZCBjb250aW51b3VzbHkgb3ZlciBkZXZlbG9wbWVudCAoIkNvbnRpbnVvdXMgZGV2ZWxvcG1lbnQgYXQgdGhlIHBhcnRpY2lwYW50IGxldmVsOiBBIHJlLWFuYWx5c2lzIG9mIFN0dWRpZXMgMS0zIikuCgojIE92ZXJ2aWV3IG9mIE1ldGhvZHMgYW5kIEFuYWx5c2VzCgpTdHVkaWVzIDEtMyB1c2VkIHZlcnkgc2ltaWxhciBleHBlcmltZW50YWwgcGFyYWRpZ21zIGFuZCB3ZXJlIGRlc2lnbmVkIHdpdGggdGhlIHNhbWUgYW5hbHlzZXMgaW4gbWluZC4gSGVyZSB3ZSBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIHRoZSBtZXRob2RzIGFuZCBwbGFubmVkIGFuYWx5c2VzIGZvciBhbGwgb2YgdGhlc2Ugc3R1ZGllczsgYW55IGRldGFpbHMgdGhhdCB2YXJpZWQgYWNyb3NzIHN0dWRpZXMgYXJlIHN1cHBsaWVkIGluIHRoZSAiTWV0aG9kcyIgc2VjdGlvbiBvZiBlYWNoIG9mIHRoZSBzdHVkaWVzLiAKCiMjIEdlbmVyYWwgbWV0aG9kcwoKRm9sbG93aW5nIFdlaXNtYW4gZXQgYWwuICgyMDE3KSwgdGhlc2Ugc3R1ZGllcyB3ZXJlIGRlc2lnbmVkIHdpdGggdGhlIGdvYWwgb2YgZm9jdXNpbmcgcGFydGljaXBhbnRzJyBhdHRlbnRpb24gb24gdGhlIHNpbWlsYXJpdGllcywgZGlmZmVyZW5jZXMsIGFuZCByZWxhdGlvbnNoaXBzIGFtb25nIHZhcmlvdXMgbWVudGFsIGNhcGFjaXRpZXMuCgpUbyB0aGlzIGVuZCwgZWFjaCBwYXJ0aWNpcGFudCB3YXMgZWl0aGVyIHJhbmRvbWx5IG9yIHBzZXVkby1yYW5kb21seSBhc3NpZ25lZCB0byBhc3Nlc3MgMS0yIHRhcmdldCBlbnRpdGllcyAoZS5nLiwgYSBiZWV0bGUsIGEgcm9ib3QsIGEgZ29hdCwgZXRjLikgb24gYSB3aWRlIHJhbmdlIG9mIHNlbnNvcnksIHBlcmNlcHR1YWwsIGVtb3Rpb25hbCwgc29jaWFsLCBjb2duaXRpdmUsIGFuZCBvdGhlciBtZW50YWwgY2FwYWNpdGllcywgcmFuZ2luZyBpbiBudW1iZXIgZnJvbSAxOC00MCBhY3Jvc3Mgc3R1ZGllcyBhbmQgcHJlc2VudGVkIGluIGVpdGhlciBhIHJhbmRvbSBvciBhIHBzZXVkby1yYW5kb20gKGNvdW50ZXJiYWxhbmNlZCkgb3JkZXIuIFBhcnRpY2lwYW50cyB3ZXJlIHByZXNlbnRlZCB3aXRoIGEgdml2aWQsIGZ1bGwtY29sb3IgcGhvdG9ncmFwaCBvZiB0aGVpciBhc3NpZ25lZCB0YXJnZXQgaW4gYSBuYXR1cmFsaXN0aWMgY29udGV4dCAoZS5nLiwgYSBiZWV0bGUgb24gYSBsZWFmOyBhIHJvYm90IGluIGFuIG9mZmljZTsgYSBnb2F0IGluIGEgZ3Jhc3N5IGZpZWxkKSwgd2hpY2ggdGhleSBoYWQgYWNjZXNzIHRvIHRocm91Z2hvdXQgdGhlIHN0dWR5LiAKCk9uIGVhY2ggdHJpYWwsIHBhcnRpY2lwYW50cyB3ZXJlIGFza2VkIGEgcXVlc3Rpb24gb2YgdGhlIGZvcm0gRG8geW91IHRoaW5rIGEgW3RhcmdldF0gY2FuIFtkbyBYXT8gKGUuZy4sICJEbyB5b3UgdGhpbmsgYSBiZWV0bGUgY2FuIGZlZWwgaGFwcHk/IjsgU3R1ZGllcyAxLTIpIG9yIENhbiBbdGFyZ2V0c10gW2RvIFhdPyAoU3R1ZHkgMykgKGUuZy4sICJDYW4gYmVldGxlcyBmZWVsIGhhcHB5PyIpLiBQYXJ0aWNpcGFudHMgcmVzcG9uZGVkIG9uIGEgdGhyZWUtcG9pbnQgc2NhbGUgKG5vLCBjb2RlZCBhcyAwOyBraW5kYSwgY29kZWQgYXMgMC41OyBvciB5ZXMsIGNvZGVkIGFzIDEpLiBBbHRob3VnaCBhIHRocmVlLXBvaW50IHNjYWxlIGlzIG5vdCBvcHRpbWFsIGZvciBmYWN0b3IgYW5hbHlzZXMsIHBpbG90IHRlc3Rpbmcgc3VnZ2VzdGVkIHRoYXQgaXQgd2FzIGNyaXRpY2FsIGluIGFsbG93aW5nIGNoaWxkcmVuIHRvIG1vdmUgZmFzdCBlbm91Z2ggdGhyb3VnaCB0aGUgc3R1ZHkgdG8gYW5zd2VyIGFsbCBxdWVzdGlvbnMsIGFuZCBtYWludGFpbmluZyB0aGlzIHdpdGhpbi1zdWJqZWN0cyBkZXNpZ24gd2FzIG91ciB0b3AgcHJpb3JpdHkgZm9yIHRoZSBwbGFubmVkIGFuYWx5c2VzLgoKU2VlIHRoZSBNZXRob2RzIHNlY3Rpb24gZm9yIGVhY2ggc3R1ZHkgZm9yIGRldGFpbHMgb2YgdGhlIHBhcnRpY3VsYXIgdGFyZ2V0IGVudGl0aWVzIGFuZCBtZW50YWwgY2FwYWNpdGllcyBpbmNsdWRlZCBpbiBlYWNoIHN0dWR5LCBhcyB3ZWxsIGFzIHRoZSBtYXRlcmlhbHMgYW5kIHBoeXNpY2FsIHNldHVwLgoKIyMgUHJpbWFyeSBhbmFseXNpczogRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpCgpPdXIgcHJpbWFyeSBnb2FsIGluIGNvbmR1Y3RpbmcgdGhlc2Ugc3R1ZGllcyB3YXMgdG8gdW5jb3ZlciBhIHNldCBvZiBsYXRlbnQgY29uc3RydWN0cyB0aGF0IG1pZ2h0IHBsYXVzaWJseSBoYXZlIGdpdmVuIHJpc2UgdG8gdGhlIG9ic2VydmVkIGNvcnJlbGF0aW9ucyBhbW9uZyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGluIGVhY2ggZ3JvdXAgb2YgcGFydGljaXBhbnRzLiBBcyBzdWNoLCBvdXIgcHJpbWFyeSBwbGFubmVkIGFuYWx5c2lzIGZvciBhbGwgc3R1ZGllcyB3YXMgYW4gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEpLiBGb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4gKDIwMTcpLCB3ZSBpbnRlcnByZXRlZCBlYWNoIG9mIHRoZSBjb25zdHJ1Y3RzICgiZmFjdG9ycyIpIGFzIGNvcnJlc3BvbmRpbmcgdG8gYSBmdW5kYW1lbnRhbCBjb21wb25lbnQgb2YgbWVudGFsIGxpZmUsIGFjY29yZGluZyB0byB0aGlzIGdyb3VwIG9mIHBhcnRpY2lwYW50czsgYnkgZXh0ZW5zaW9uLCB3ZSBjb25zaWRlciB0aGUgZnVsbCBzZXQgb2YgZmFjdG9ycyBmb3IgZWFjaCBzYW1wbGUgdG8gcmVwcmVzZW50IHRvIHRoZSBvdmVyYWxsICJjb25jZXB0dWFsIHN0cnVjdHVyZSIgdW5kZXJseWluZyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGZvciB0aGlzIGdyb3VwIG9mIHBhcnRpY2lwYW50cy4KCkZvciBhbGwgRUZBcywgd2UgdXNlZCBvcmRpbmFyeSBsZWFzdCBzcXVhcmVzIHRvIGZpbmQgdGhlIG1pbmltdW0gcmVzaWR1YWwgc29sdXRpb24sIHVzaW5nIHRoZSAicHN5Y2giIHBhY2thZ2UgZm9yIFIgKFJldmVsbGUsIDIwMTgpLiBIZXJlIHdlIGZvY3VzIG9uIHJlc3VsdHMgdXNpbmcgUGVhcnNvbiBjb3JyZWxhdGlvbnMgdXNpbmcgcGFpcndpc2UgY29tcGxldGUgb2JzZXJ2YXRpb25zLiAoU2VlIE9ubGluZSBTdXBwbGVtZW50YXJ5IE1hdGVyaWFscyBbT1NNXSBmb3Igc29sdXRpb25zIHVzaW5nIHBvbHljaG9yaWMgY29ycmVsYXRpb25zLCB3aGljaCBhcmUgYmV0dGVyIHN1aXRlZCB0byBoYW5kbGUgcmVzcG9uc2VzIG9uIGEgdGhyZWUtcG9pbnQgc2NhbGUgYnV0LCB0byBvdXIgZXllcywgdGVuZGVkIHRvIG92ZXItZml0IG91ciBkYXRhIGJ5IHN1Z2dlc3RpbmcgdGhhdCB3ZSBzaG91bGQgcmV0YWluIG1hbnkgZmFjdG9ycyB0aGF0IGVhY2ggYWNjb3VudGVkIGZvciBvbmx5IGEgc21hbGwgYW1vdW50IG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UuKQoKSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluLCB3ZSBleGFtaW5lZCB0aGUgcmVzdWx0cyBvZiB0aHJlZSBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29sczogKDEpIFBhcmFsbGVsIEFuYWx5c2lzLCB3aGljaCBjb21wYXJlcyB0aGUgb2JzZXJ2ZWQgY29ycmVsYXRpb24gc3RydWN0dXJlIHRvIHRoZSBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmUgYXJpc2luZyBmcm9tIHJhbmRvbSBkYXRhc2V0cyBvZiB0aGUgc2FtZSBzaXplOyAoMikgTWluaW1pemluZyB0aGUgQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChCSUMpLCB3aGljaCBpcyBvbmUgbWV0aG9kIG9mIG9wdGltaXppbmcgYm90aCBnb29kbmVzcyBvZiBmaXQgYW5kIHBhcnNpbW9ueTsgYW5kICgzKSBBIHNldCBvZiBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhIHRoYXQgaGF2ZSBiZWVuIHVzZWQgaW4gV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgcHJldmlvdXMgd29yaywgaW4gd2hpY2ggdGhleSBiZWdhbiB3aXRoIHRoZSBtYXhpbWFsIG51bWJlciBvZiBmYWN0b3JzIGFjY29yZGluZyB0byBhbiBhbmFseXNpcyBvZiBkZWdyZWVzIG9mIGZyZWVkb20sIGFuZCByZXRhaW5lZCBmYWN0b3JzIHRoYXQgbWV0IGFsbCB0aHJlZSBvZiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOiAoYSkgaGFkIGVpZ2VudmFsdWVzIGdyZWF0ZXIgdGhhbiAxLjAwLCAoYikgaW5kaXZpZHVhbGx5IGFjY291bnRlZCBmb3IgZ3JlYXRlciB0aGFuIDUlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgYmVmb3JlIHJvdGF0aW9uLCBhbmQgKGMpIHdlcmUgdGhlICJkb21pbmFudCIgZmFjdG9yICh0aGUgZmFjdG9yIHdpdGggdGhlIHN0cm9uZ2VzdCBhYnNvbHV0ZSBmYWN0b3IgbG9hZGluZykgZm9yIGF0IGxlYXN0IDEgbWVudGFsIGNhcGFjaXR5IGFmdGVyIHJvdGF0aW9uLiBGb3IgZWFjaCBzdHVkeSwgb3VyIGludGVycHJldGF0aW9uIG9mIGhvdyBiZXN0IHRvIGNoYXJhY3Rlcml6ZSB0aGUgZGF0YXNldCAoaS5lLiwgaG93IG1hbnkgZmFjdG9ycyB3ZSBvYnNlcnZlKSB3YXMgZGV0ZXJtaW5lZCBieSB0aGUgZGVncmVlIG9mIGNvbnNlbnN1cyBhbW9uZyB0aGVzZSB0aHJlZSBwcm90b2NvbHMgYW5kIHRoZSBpbnRlcnByZXRhYmlsaXR5IG9mIHRoZSByZXRhaW5lZCBmYWN0b3JzIHVuZGVyIGVhY2ggcHJvdG9jb2wuIAoKSGVyZSB3ZSBmb2N1cyBvdXIgaW50ZXJwcmV0YXRpb25zIG9uIHZhcmltYXgtcm90YXRlZCBzb2x1dGlvbnMsIHdoaWNoIGNvbnN0cmFpbiBhbGwgZmFjdG9ycyB0byBiZSBvcnRob2dvbmFsLiAoU2VlIE9TTSBmb3Igc29sdXRpb25zIHVzaW5nIG9ibGlxdWUgWyJvYmxpbWluIl0gcm90YXRpb25zLCB3aGljaCBhbGxvdyBmb3IgY29ycmVsYXRlZCBmYWN0b3JzLikKCiMjIFNlY29uZGFyeSBhbmFseXNpczogUmVncmVzc2lvbiBhbmFseXNlcyBvZiBmYWN0b3Igc2NvcmVzCgpIYXZpbmcgaW5mZXJyZWQgYSBjb25jZXB0dWFsIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBncm91cCBvZiBwYXJ0aWNpcGFudHMgdmlhIEVGQSwgd2UgdGhlbiBzb3VnaHQgdG8gZXhhbWluZSBhdHRyaWJ1dGlvbnMgb2YgbWVudGFsIGNhcGFjaXRpZXMgdG8gdGhlIHBhcnRpY3VsYXIgdGFyZ2V0IGVudGl0aWVzIGluY2x1ZGVkIGluIGVhY2ggc3R1ZHkgd2l0aGluIHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmU6IFRvIHdoYXQgZXh0ZW50IGRpZCBwYXJ0aWNpcGFudHMgYXR0cmlidXRlIGVhY2ggb2YgdGhlIGZ1bmRhbWVudGFsIGNvbXBvbmVudHMgb2YgbWVudGFsIGxpZmUgcmV2ZWFsZWQgYnkgRUZBIHRvIGEgZ2l2ZW4gdGFyZ2V0IGVudGl0eSwgYW5kIGhvdyBkaWQgdGhpcyBhdHRyaWJ1dGlvbnMgdmFyeSB3aXRoIGFnZSAoZWl0aGVyIHdpdGhpbiBhbiBhZ2UgZ3JvdXAgb3IgYmV0d2VlbiBhZ2UgZ3JvdXBzKT8gVG8gZXhwbG9yZSB0aGlzIHF1ZXN0aW9uLCB3ZSBleGFtaW5lZCAiZmFjdG9yIHNjb3JlcyLigJRzdW1tYXJpZXMgb2YgZWFjaCBwYXJ0aWNpcGFudCdzIGF0dHJpYnV0aW9ucyBvZiBlYWNoIG9mIGZhY3RvcnMgcmV2ZWFsZWQgYnkgRUZBLiBXZSB1c2VkIHRoZSBjb3JyZWxhdGlvbi1wcmVzZXJ2aW5nICJ0ZW4gQmVyZ2UiIG1ldGhvZCAoYXMgaW1wbGVtZW50ZWQgaW4gdGhlICJwc3ljaCIgcGFja2FnZTsgUmV2ZWxsZSwgMjAxOCksIGltcHV0aW5nIG1pc3NpbmcgdmFsdWVzIHVzaW5nIHRoZSBtZWFuIChieSB0YXJnZXQgY2hhcmFjdGVyLCBjYXBhY2l0eSwgYW5kIGFnZSBncm91cCkuIFRoaXMgeWllbGRlZCBvbmUgZmFjdG9yIHNjb3JlIGZvciBlYWNoIG9mIHRoZSBmYWN0b3JzIHJldmVhbGVkIGJ5IEVGQSBmb3IgZWFjaCBwYXJ0aWNpcGFudC4KCldlIGFuYWx5emVkIHRoZXNlIGZhY3RvciBzY29yZXMgdmlhIG1peGVkIGVmZmVjdHMgQmF5ZXNpYW4gcmVncmVzc2lvbiBhbmFseXNlcyB1c2luZyB0aGUgImJybXMiIHBhY2thZ2UgZm9yIFIgKELDvHJrbmVyLCAyMDE3KS4gSW4gYWxsIG9mIHRoZXNlIGFuYWx5c2VzLCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgd2VyZSBlZmZlY3QtY29kZWQsIGNvbnRpbnVvdXMgdmFyaWFibGVzIHdlcmUgY2VudGVyZWQgYXQgdGhlIG1lYW4sIGFuZCB3ZSBpbmNsdWRlZCB0aGUgbWF4aW1hbCByYW5kb20gZWZmZWN0IHN0cnVjdHVyZXMgZ2l2ZW4gdGhlIGRlc2lnbiBmb3IgdGhlIHJlbGV2YW50IHN0dWR5LiBGdXJ0aGVyIGRldGFpbHMgdmFyaWVkIGJ5IHN0dWR5LCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0YXJnZXQgZW50aXRpZXMgaW5jbHVkZWQgaW4gdGhhdCBzdHVkeSwgdGhlIG51bWJlciBvZiBmYWN0b3JzIHJldmVhbGVkIGJ5IEVGQSBmb3IgdGhlIHJlbGV2YW50IGdyb3VwKHMpIG9mIHBhcnRpY2lwYW50cywgYW5kIHRoZSBnb2FscyBvZiB0aGUgYW5hbHlzaXMgKGUuZy4sIGNvbXBhcmluZyB0d28gYWdlIGdyb3VwcyB2cy4gZXhhbWluaW5nIGNvbnRpbnVvdXMgZWZmZWN0cyBvZiBhZ2Ugd2l0aGluIG9uZSBvciBtb3JlIGdyb3VwcyBvZiBwYXJ0aWNpcGFudHMpLgoKIyBTdHVkeSAxCgpUaGUgZ29hbCBvZiBTdHVkeSAxIHdhcyB0byBkZXZlbG9wIGEgY2hpbGQtZnJpZW5kbHkgdmVyc2lvbiBvZiBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBzdHVkeSBwYXJhZGlnbSBhbmQgY29uZHVjdCBhbiBpbml0aWFsIGV4cGxvcmF0aW9uIG9mIHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgYW1vbmcgY2hpbGRyZW4uIAoKUGlsb3QgdGVzdGluZyBzdWdnZXN0ZWQgdGhhdCBjaGlsZHJlbiBhcyB5b3VuZyBhcyA3IHllYXJzIG9mIGFnZSBmb3VuZCB0aGUgcGFyYWRpZ20gZWFzeSBhbmQgZW5qb3lhYmxlLCBhbmQgd29yayBvbiB0aGUgZGV2ZWxvcG1lbnQgb2YgbGF5IGJpb2xvZ3kgYW5kIHBzeWNob2xvZ3kgaGFzIHN1Z2dlc3RlZCB0aGF0IHRoZXNlIGNvbmNlcHRzIG1heSBjb250aW51ZSB0byBkZXZlbG9wIHdlbGwgaW50byBtaWRkbGUgY2hpbGRob29kIChlLmcuLCBDYXJleSwgMTk4NTsgSGF0YW5vICYgSW5hZ2FraSwgMTk5NzsgUGlhZ2V0LCAxOTI5OyBjZi4gR2VsbWFuICYgT3BmZXIsIDIwMDIpLiBUaHVzLCB3ZSB0YXJnZXRlZCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIGZvciBvdXIgZmlyc3QgY2hpbGQgc2FtcGxlLiBXZSBhbHNvIHJlY3J1aXRlZCBhIGdyb3VwIG9mIGFkdWx0cyB0byB2YWxpZGF0ZSBvdXIgY2hpbGQtIGZyaWVuZGx5IHBhcmFkaWdtLCBpLmUuLCB0byBldmFsdWF0ZSB3aGV0aGVyIGl0IHJlcGxpY2F0ZWQgV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgb3JpZ2luYWwgd29yayB3aXRoIGFkdWx0cy4KSW4gV2Vpc21hbiBldCBhbC4ncyAoMjAxNykgb3JpZ2luYWwgc3R1ZGllcywgcGFydGljaXBhbnRzIGV2YWx1YXRlZCBhIHRhcmdldCBjaGFyYWN0ZXIgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMgdXNpbmcgYSBzZXZlbi1wb2ludCBMaWtlcnQtdHlwZSBzY2FsZS4gUGlsb3QgdGVzdGluZyBzdWdnZXN0ZWQgdHdvIG5lY2Vzc2FyeSBtb2RpZmljYXRpb25zIGZvciBjaGlsZHJlbjogcmV3b3JkaW5nIHNvbWUgb2YgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcywgYW5kIHVzaW5nIGEgc2ltcGxlciwgdGhyZWUtcG9pbnQgcmVzcG9uc2Ugc2NhbGUgKG5vLCBraW5kYSwgb3IgeWVzOyBzZWUgIk92ZXJ2aWV3IG9mIE1ldGhvZHMgYW5kIEFuYWx5c2VzLCBhYm92ZSIpLiAKCiMjIE1ldGhvZAoKIyMjIFBhcnRpY2lwYW50cwoKYHIgbnJvdyhkMV9hZF93aWRlKSArIG5yb3coZDFfNzlfd2lkZSlgIHBlb3BsZSBwYXJ0aWNpcGF0ZWQgaW4gdGhpcyBzdHVkeS4KCmBgYHtyfQojIGRlbW9ncmFwaGljcwpkMV9hZF9nZW5kZXIgPC0gZGVtb19mdW4oZDFfYWQsICJnZW5kZXIiLCAyKQpkMV9hZF9ldGhuaWNpdHkgPC0gZGVtb19mdW4oZDFfYWQsICJldGhuaWNpdHlfY2F0IiwgMikKZDFfYWRfZW5nbGlzaCA8LSBkZW1vX2Z1bihkMV9hZCwgImVuZ2xpc2hOYXRpdmUiLCAyKQpgYGAKCkFkdWx0cyAoX25fPWByIG5yb3coZDFfYWRfd2lkZSlgKSBwYXJ0aWNpcGF0ZWQgdmlhIEFtYXpvbiBNZWNoYW5pY2FsIFR1cmsgKE1UdXJrKSBpbiBKdWx5IDIwMTYuIEFkdWx0IHBhcnRpY2lwYW50cyBoYWQgZ2FpbmVkIGFwcHJvdmFsIGZvciBhdCBsZWFzdCA5NSUgb2YgdGhlaXIgcHJldmlvdXMgd29yayBvbiBNVHVyazsgaGFkIE1UdXJrIGFjY291bnRzIGJhc2VkIGluIHRoZSBVUzsgYW5kIGluZGljYXRlZCB0aGF0IHRoZXkgd2VyZSBhdCBsZWFzdCAxOCB5ZWFycyBvbGQuIEFkdWx0cyB3ZXJlIHBhaWQgXCQwLjMwIGZvciBhcHByb3hpbWF0ZWx5IDItMyBtaW51dGVzIG9mIHRoZWlyIHRpbWUgKG1lZGlhbiBkdXJhdGlvbjogYHIgc3VtbWFyeShkMV9hZCRkdXJhdGlvbilbIk1lZGlhbiJdICU+JSByb3VuZCgyKWAgbWluKS4gCgpBY2NvcmRpbmcgdG8gc2VsZiByZXBvcnQsIHRoZSBhZHVsdCBzYW1wbGUgcmFuZ2VkIGluIGFnZSBmcm9tIGByIHN1bW1hcnkoZDFfYWQkYWdlKVsiTWluLiJdYC1gciBzdW1tYXJ5KGQxX2FkJGFnZSlbIk1heC4iXWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkMV9hZCRhZ2UpWyJNZWRpYW4iXWB5KSBhbmQgd2FzIHJvdWdobHkgc3BsaXQgYmV0d2VlbiB3b21lbiAoYHIgZDFfYWRfZ2VuZGVyJHByb3BbZDFfYWRfZ2VuZGVyJGdlbmRlcj09ImZlbWFsZSJdICogMTAwYCUpIGFuZCBtZW4gKGByIGQxX2FkX2dlbmRlciRwcm9wW2QxX2FkX2dlbmRlciRnZW5kZXI9PSJtYWxlIl0gKiAxMDBgJTsgYHIgZDFfYWRfZ2VuZGVyJHByb3BbZDFfYWRfZ2VuZGVyJGdlbmRlcj09Im90aGVyX3ByZWZObyJdICogMTAwYCUgb2YgcGFydGljaXBhbnRzIGlkZW50aWZpZWQgYXMgc29tZSBvdGhlciBnZW5kZXIgb3Igb3B0ZWQgbm90IHRvIGRpc2Nsb3NlKS4gQWR1bHRzIHByZWRvbWluYW50bHkgaWRlbnRpZmllZCBhcyBXaGl0ZSAoYHIgZDFfYWRfZXRobmljaXR5JHByb3BbZDFfYWRfZXRobmljaXR5JGV0aG5pY2l0eV9jYXQ9PSJ3aGl0ZSJdICogMTAwYCU7IGByIGQxX2FkX2V0aG5pY2l0eSRwcm9wW2QxX2FkX2V0aG5pY2l0eSRldGhuaWNpdHlfY2F0PT0ibXVsdGkiXSAqIDEwMGAlIGlkZW50aWZpZWQgYXMgbW9yZSB0aGFuIG9uZSByYWNlL2V0aG5pY2l0eSwgYW5kICRcbGVxJCBgciBkYXRhLmZyYW1lKGQxX2FkX2V0aG5pY2l0eSAlPiUgZmlsdGVyKCFldGhuaWNpdHlfY2F0ICVpbiUgYygid2hpdGUiLCAibXVsdGkiKSkpJHByb3AgJT4lIG1heCgpICogMTAwYCUgYXMgYW55IG90aGVyIHJhY2UvZXRobmljaXR5KS4gVGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzIHJlcG9ydGVkIEVuZ2xpc2ggYmVpbmcgdGhlaXIgb25seSBuYXRpdmUgbGFuZ3VhZ2UgKGByIGQxX2FkX2VuZ2xpc2gkcHJvcFtkMV9hZF9lbmdsaXNoJGVuZ2xpc2hOYXRpdmUgPT0gInllc19vbmx5Il0gKiAxMDBgJTsgYW4gYWRkaXRpb25hbCBgciBkMV9hZF9lbmdsaXNoJHByb3BbZDFfYWRfZW5nbGlzaCRlbmdsaXNoTmF0aXZlID09ICJ5ZXNfbXVsdGlwbGUiXSAqIDEwMGAlIGluZGljYXRlZCB0aGF0IEVuZ2xpc2ggd2FzIG9uZSBvZiBtdWx0aXBsZSBuYXRpdmUgbGFuZ3VhZ2VzIGZvciB0aGVtLikKCmBgYHtyfQojIGRlbW9ncmFwaGljcwpkMV83OV9nZW5kZXIgPC0gZGVtb19mdW4oZDFfNzksICJnZW5kZXIiLCAyKQpkMV83OV9ldGhuaWNpdHkgPC0gZGVtb19mdW4oZDFfNzksICJldGhuaWNpdHkiLCAyKQpkMV83OV9iaWxpbmd1YWwgPC0gZGVtb19mdW4oZDFfNzksICJiaWxpbmd1YWwiLCAyKQpgYGAKCkNoaWxkcmVuIChfbl89YHIgbnJvdyhkMV83OV93aWRlKWApIHBhcnRpY2lwYXRlZCBhdCBvbmUgb2Ygc2V2ZXJhbCBTYW4gRnJhbmNpc2NvIEJheSBBcmVhIG11c2V1bXMgb3IgYXQgdGhlaXIgeW91bmdlciBzaWJsaW5nJ3MgcHJlc2Nob29sIGJldHdlZW4gSnVseS1EZWNlbWJlciAyMDE2LiBUaGUgc3R1ZHkgdG9vayBtb3N0IGNoaWxkcmVuIHVuZGVyIDEwIG1pbnV0ZXMgdG8gY29tcGxldGUgKG1lZGlhbiBkdXJhdGlvbjogYHIgc3VtbWFyeShkMV83OSRkdXJhdGlvbilbIk1lZGlhbiJdICU+JSByb3VuZCgyKWAgbWluKS4gQW4gYWRkaXRpb25hbCAxMiBjaGlsZHJlbiBwYXJ0aWNpcGF0ZWQgYnV0IHdlcmUgZXhjbHVkZWQgZm9yIGJlaW5nIG91dHNpZGUgdGhlIHRhcmdldCBhZ2UgcmFuZ2UgKF9uXz03KSwgYmVpbmcgb2YgdW5rbm93biBhZ2UgKF9uXz00KSwgb3IgYmVpbmcgc2hvd24gYSB0YXJnZXQgY2hhcmFjdGVyIG90aGVyIHRoYW4gYSBiZWV0bGUgb3IgYSByb2JvdCAoX25fPTEpLiBDaGlsZHJlbiByZWNlaXZlZCBhIHNtYWxsIHRoYW5rLXlvdSBnaWZ0IChlLmcuLCBhIHN0aWNrZXIpIGZvciB0aGVpciBwYXJ0aWNpcGF0aW9uLiAKCkNoaWxkcmVuIHJhbmdlZCBpbiBhZ2UgZnJvbSBgciBzdW1tYXJ5KGQxXzc5JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMilgLWByIHN1bW1hcnkoZDFfNzkkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkMV83OSRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMilgeSkuIEFjY29yZGluZyB0byBwYXJlbnRhbCByZXBvcnQsIHRoZSBjaGlsZCBzYW1wbGUgaW5jbHVkZWQgc2xpZ2h0bHkgbW9yZSBnaXJscyAoYHIgZDFfNzlfZ2VuZGVyJHByb3BbZDFfNzlfZ2VuZGVyJGdlbmRlcj09ImYiXSAqIDEwMGAlKSB0aGFuIGJveXMgKGByIGQxXzc5X2dlbmRlciRwcm9wW2QxXzc5X2dlbmRlciRnZW5kZXI9PSJtIl0gKiAxMDBgJTsgYHIgZDFfNzlfZ2VuZGVyJHByb3BbZDFfNzlfZ2VuZGVyJGdlbmRlcj09Ik1JU1NJTkciXSAqIDEwMGAlIG9mIGNoaWxkcmVuJ3MgZ2VuZGVyIHdhcyBub24tYmluYXJ5IG9yIHVua25vd24pLiBQYXJlbnRzIHByZWRvbWluYW50bHkgaWRlbnRpZmllZCB0aGVpciBjaGlsZHJlbiBhcyBXaGl0ZSAoYHIgZDFfNzlfZXRobmljaXR5JHByb3BbZDFfNzlfZXRobmljaXR5JGV0aG5pY2l0eT09IndoaXRlIl0gKiAxMDBgJSksIG11bHRpcmFjaWFsIChgciBkMV83OV9ldGhuaWNpdHkkcHJvcFtkMV83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0ibXVsdGkiXSAqIDEwMGAlKSwgRWFzdCBBc2lhbiAoYHIgZDFfNzlfZXRobmljaXR5JHByb3BbZDFfNzlfZXRobmljaXR5JGV0aG5pY2l0eT09ImVhc3QgYXNpYW4iXSAqIDEwMGAlKSwgb3IgU291dGggQXNpYW4gKGByIGQxXzc5X2V0aG5pY2l0eSRwcm9wW2QxXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJzb3V0aCBvciBzb3V0aGVhc3QgYXNpYW4iXSAqIDEwMGAlOyAkXGxlcSQgYHIgZGF0YS5mcmFtZShkMV83OV9ldGhuaWNpdHkgJT4lIGZpbHRlcighZXRobmljaXR5ICVpbiUgYygid2hpdGUiLCAibXVsdGkiLCAiZWFzdCBhc2lhbiIsICJzb3V0aCBvciBzb3V0aGVhc3QgYXNpYW4iLCAiTUlTU0lORyIpKSkkcHJvcCAlPiUgbWF4KCkgKiAxMDBgJSBvZiBjaGlsZHJlbiB3ZXJlIGlkZW50aWZpZWQgYXMgYW55IG90aGVyIHJhY2UvZXRobmljaXR5LCBhbmQgYHIgZDFfNzlfZXRobmljaXR5JHByb3BbZDFfNzlfZXRobmljaXR5JGV0aG5pY2l0eT09Ik1JU1NJTkciXSAqIDEwMGAlIG9mIGNoaWxkcmVuJ3MgcmFjZS9ldGhuaWNpdHkgd2FzIHVua25vd24pLiBSb3VnaGx5IGhhbGYgb2YgcGFyZW50cyAoYHIgZDFfNzlfYmlsaW5ndWFsJHByb3BbZDFfNzlfYmlsaW5ndWFsJGJpbGluZ3VhbD09InllcyJdICogMTAwYCUpIHJlcG9ydGVkIHRoYXQgdGhlaXIgY2hpbGQgd2FzIGJpbGluZ3VhbCAodGhvdWdoLCBhbmVjZG90YWxseSwgcGFyZW50cycgaW50ZXJwcmV0YXRpb25zIG9mICJiaWxpbmd1YWwiIHJhbmdlZCBmcm9tIHRha2luZyBjbGFzc2VzIGF0IHNjaG9vbCB0byBzcGVha2luZyBhIGxhbmdhdWdlIGF0IGhvbWUpLgoKIyMjIE1hdGVyaWFscyBhbmQgcHJvY2VkdXJlCgpGb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4gKDIwMTcsIFN0dWRpZXMgMS0zKSwgcGFydGljaXBhbnRzIHdlcmUgcmFuZG9tbHkgYXNzaWduZWQgdG8gYXNzZXNzIHRoZSBtZW50YWwgY2FwYWNpdGllcyBvZiBvbmUgb2YgdHdvICJlZGdlIGNhc2VzIiBpbiBzb2NpYWwgcmVhc29uaW5nOiBhIGJlZXRsZSAoX25fPWByIGQxX2FkICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09ICJiZWV0bGUiKSAlPiUgZGlzdGluY3Qoc3ViaWQpICU+JSBucm93KClgIGFkdWx0cywgX25fPWByIGQxXzc5ICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09ICJiZWV0bGUiKSAlPiUgZGlzdGluY3Qoc3ViaWQpICU+JSBucm93KClgIGNoaWxkcmVuKSBvciBhIHJvYm90IChfbl89YHIgZDFfYWQgJT4lIGZpbHRlcihjaGFyYWN0ZXIgPT0gInJvYm90IikgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgbnJvdygpYCBhZHVsdHMsIF9uXz1gciBkMV83OSAlPiUgZmlsdGVyKGNoYXJhY3RlciA9PSAicm9ib3QiKSAlPiUgZGlzdGluY3Qoc3ViaWQpICU+JSBucm93KClgIGNoaWxkcmVuKS4gQmVjYXVzZSBiZWV0bGVzIGFyZSBhbmltYWxzIGFuZCByb2JvdHMgYXJlIGFydGlmYWN0cywgdGhpcyBwYWlyIHByb3ZpZGVzIGluc2lnaHQgaW50byB0aGUgcm9sZSBvZiBiaW9sb2dpY2FsIGxpZmUgaW4gYXR0cmlidXRpb25zIG9mIG1lbnRhbCBsaWZl4oCUYW4gaXNzdWUgb2YgcGFydGljdWxhciBpbnRlcmVzdCBmcm9tIGEgZGV2ZWxvcG1lbnRhbCBwZXJzcGVjdGl2ZSwgZ2l2ZW4gdGhlIGxvbmcgaGlzdG9yeSBvZiB3b3JrIG9uIHRoZSBkZXZlbG9wbWVudCBvZiB0aGUgYW5pbWF0ZS1pbmFuaW1hdGUgZGlzdGluY3Rpb24gYW5kIGl0cyByZWxhdGlvbiB0byBmb2xrIHBzeWNob2xvZ3kuIE1vc3QgY3JpdGljYWxseSBmb3Igb3VyIGJvdHRvbS11cCBhcHByb2FjaCB0byB1bmNvdmVyaW5nIGNvbmNlcHR1YWwgc3RydWN0dXJlLCB0aGUgIm1lbnRhbCBsaXZlcyIgb2YgdGhlc2UgZW50aXRpZXMgYXJlIGNvbnRyb3ZlcnNpYWw6IFBlb3BsZSBkaWZmZXIgaW4gdGhlaXIgYXNzZXNzbWVudHMgb2YgdGhlIG1lbnRhbCBjYXBhY2l0aWVzIG9mIGJlZXRsZXMgYW5kIHJvYm90cy4gVGhpcyBhbGxvd2VkIHVzIHRvIGFkZHJlc3MgdGhlIGZvbGxvd2luZyBxdWVzdGlvbjogV2hlbiBwYXJ0aWNpcGFudHMgZGlzYWdyZWUgYWJvdXQgdGhlIG1lbnRhbCBjYXBhY2l0aWVzIG9mIHNvbWUgZW50aXR5LCB3aGljaCBjYXBhY2l0aWVzICJnbyB0b2dldGhlciI/CgpJbnN0cnVjdGlvbnMgdG8gcGFydGljaXBhbnRzIGZvY3VzZWQgb24gdGhlIGlkZWEgdGhhdCB3ZSB3YW50ZWQgdG8ga25vdyB3aGF0IHBhcnRpY2lwYW50cyB0aG91Z2h0ICJbYmVldGxlcy9yb2JvdHNdIGNhbiBkbyBhbmQgY2FuIG5vdCBkby4iIFBhcnRpY2lwYW50cyByYXRlZCB0aGUgdGFyZ2V0IGNoYXJhY3RlciBvbiA0MCBtZW50YWwgY2FwYWNpdGllcywgcHJlc2VudGVkIGluIGEgcmFuZG9tIG9yZGVyIGZvciBlYWNoIHBhcnRpY2lwYW50LiBPbiBlYWNoIHRyaWFsLCBwYXJ0aWNpcGFudHMgcmVzcG9uZGVkIF9ub18sIF9raW5kYV8sIG9yIF95ZXNfIHRvIHRoZSBxdWVzdGlvbiAiRG8geW91IHRoaW5rIGEgW2JlZXRsZS9yb2JvdF0gY2FuLi4uPyIgVGhlIHRocmVlIHJlc3BvbnNlIG9wdGlvbnMgd2VyZSB2aXNpYmxlIHRocm91Z2hvdXQgdGhlIGV4cGVyaW1lbnQuCgpUaGUgNDAgbWVudGFsIGNhcGFjaXRpZXMgd2VyZSBkZXNpZ25lZCB0byBiZSBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aG9zZSBpbiBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBvcmlnaW5hbCBzdHVkaWVzLCB3aGlsZSBiZWluZyBjb21wcmVoZW5zaWJsZSB0byBjaGlsZHJlbiBpbiBlYXJseSBlbGVtZW50YXJ5IHNjaG9vbC4gVGhpcyBzZXQgb2YgaXRlbXMgaW5jbHVkZWQgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIHJlbGF0ZWQgdG8gYmlvbG9naWNhbCBuZWVkcyAoZS5nLiwgX2dldCBodW5ncnlfKTsgZW1vdGlvbmFsIGV4cGVyaWVuY2VzIChlLmcuLCBfZmVlbCBoYXBweV8pOyBwZXJjZXB0dWFsIGFiaWxpdGllcyAoZS5nLiwgX2hlYXIgc291bmRzXyk7IGNvZ25pdGl2ZSBhYmlsaXRpZXMgKGUuZy4sIF9yZW1lbWJlciB0aGluZ3NfKTsgY2FwYWNpdGllcyByZWxhdGVkIHRvIGF1dG9ub215IG9yIGFnZW5jeSAoZS5nLiwgX2RlY2lkZSB3aGF0IHRvIGRvXyk7IHNvY2lhbCBhYmlsaXRpZXMgKGUuZy4sIF9mZWVsIGd1aWx0eV8pOyBhbmQgc2V2ZXJhbCBhZGRpdGlvbmFsIGl0ZW1zIChlLmcuLCBfYmUgYXdhcmUgb2YgaXRzZWxmXykuIEVhY2ggb2YgdGhlc2UgYSBwcmlvcmkgY2F0ZWdvcmllcyBpbmNsdWRlZCBhdCBsZWFzdCBmaXZlIGl0ZW1zIG9mIHZhcnlpbmcgdmFsZW5jZSwgY29tcGxleGl0eSwgYW5kIHBocmFzaW5nLiAoU2VlIEZpZ3VyZSAxIGZvciB0aGUgZnVsbCBsaXN0IG9mIG1lbnRhbCBjYXBhY2l0aWVzIGluY2x1ZGVkIGluIFN0dWR5IDEuKQoKV2UgYWxzbyBwcmVwYXJlZCBhIHNob3J0IGRlZmluaXRpb24gZm9yIGVhY2ggaXRlbSwgc28gYXMgdG8gYmUgY29uc2lzdGVudCBpbiBvdXIgcmVzcG9uc2VzIHRvIHBhcnRpY2lwYW50cyAocGFydGljdWxhcmx5IGNoaWxkcmVuKSBpZiB0aGV5IGFza2VkIGZvciBjbGFyaWZpY2F0aW9uLiBDaGlsZHJlbiB3ZXJlIGVuY291cmFnZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3R1ZHkgdG8gYXNrIHF1ZXN0aW9ucyBpZiB0aGV5IGRpZCBub3Qga25vdyB3aGF0IGEgd29yZCBtZWFudCwgaW4gd2hpY2ggY2FzZSB0aGV5IGdpdmVuIHRoZXNlIGRlZmluaXRpb25zOyBhZHVsdHMgd2VyZSB0b2xkIHRoYXQgdGhleSBjb3VsZCBhY2Nlc3MgdGhlc2UgZGVmaW5pdGlvbnMgYnkgaG92ZXJpbmcgb3ZlciB0aGUgdGV4dCBvbiB0aGUgY29tcHV0ZXIgc2NyZWVuLiBQaWxvdCB0ZXN0aW5nIHN1Z2dlc3RlZCB0aGF0IHNldmVuIGl0ZW1zIHJlcXVpcmVkIGNsYXJpZmljYXRpb24gZm9yIG1vc3QgY2hpbGRyZW4sIHNvIHRoZXNlIGl0ZW1zIHdlcmUgYWx3YXlzIGFjY29tcGFuaWVkIGJ5IHRoZWlyIGRlZmluaXRpb25zIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJpYWwgKGZvciBib3RoIGFkdWx0cyBhbmQgY2hpbGRyZW4pLCBhcyBmb2xsb3dzOiBfaGF2ZSBhIHBlcnNvbmFsaXR5LCBsaWtlIHdoZW4gc29tZW9uZSBpcyBzaHkgYW5kIHNvbWVib2R5IGVsc2UgaXMgc2lsbHlfOyBfaGF2ZSBiZWxpZWZzLCBsaWtlIHdoZW4geW91IHRoaW5rIHNvbWV0aGluZyBpcyB0cnVlXzsgX2ZlZWwgcGxlYXN1cmUsIGxpa2Ugd2hlbiBzb21ldGhpbmcgZmVlbHMgcmVhbGx5IGdvb2RfOyBfaGF2ZSBkZXNpcmVzLCBsaWtlIHdoZW4geW91IHJlYWxseSB3YW50IHNvbWV0aGluZ187IF9oYXZlIHNlbGYtIGNvbnRyb2wsIGxpa2Ugd2hlbiB5b3Ugc3RvcCB5b3Vyc2VsZiBmcm9tIGRvaW5nIHNvbWV0aGluZyB5b3Ugc2hvdWxkbid0IGRvXzsgX2hhdmUgZ29hbHMsIGxpa2Ugd2hlbiB5b3UncmUgdHJ5aW5nIGhhcmQgdG8gZG8gc29tZXRoaW5nIG9yIG1ha2Ugc29tZXRoaW5nIGhhcHBlbl87IGFuZCBfZmVlbCBzaWNrLCBsaWtlIHdoZW4geW91IGZlZWwgbGlrZSB5b3UgbWlnaHQgdGhyb3cgdXBfLiAKCkFkdWx0cyBjb21wbGV0ZWQgdGhlIHN0dWR5IGJ5IGNsaWNraW5nIHRocm91Z2ggYSB3ZWJzaXRlIGF0IHRoZWlyIG93biBwYWNlLCB3aXRoIG9uZSB0cmlhbCBwcmVzZW50ZWQgb24gZWFjaCBwYWdlIGFuZCBubyBhYmlsaXR5IHRvIGdvIGJhY2t3YXJkcy4gQ2hpbGRyZW4gY29tcGxldGVkIHRoZSBzdHVkeSBvbiBhbiBleHBlcmltZW50ZXIncyBsYXB0b3AgY29tcHV0ZXIuIFRoZSBleHBlcmltZW50ZXIgcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgZmlyc3Qgc2V2ZXJhbCB0cmlhbHMgb3V0IGxvdWQsIHJlcXVlc3RpbmcgdmVyYmFsIHJlc3BvbnNlcyBmcm9tIHRoZSBjaGlsZCBhbmQgc2VsZWN0ZWQgaGlzIG9yIGhlciByZXNwb25zZSBmb3IgaGVyOyBhZnRlciBzZXZlcmFsIHRyaWFscywgdGhlIGV4cGVyaW1lbnRlciBnYXZlIHRoZSBjaGlsZCB0aGUgb3B0aW9uIHRvIGNvbnRpbnVlIGluZGVwZW5kZW50bHkgKHJlYWRpbmcgdGhlIHF1ZXN0aW9ucyBhbmQgc2VsZWN0aW5nIHRoZWlyIGFuc3dlcnMgdGhlbXNlbHZlcykgaWYgdGhleSBkZXNpcmVkLiBSb3VnaGx5IGhhbGYgb2YgcGFydGljaXBhbnRzIGNvbXBsZXRlZCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0YXNrIGluZGVwZW5kZW50bHkuCgojIyMgRGF0YSBwcm9jZXNzaW5nCgpXZSBkcm9wcGVkIHRyaWFscyB3aXRoIHJlc3BvbnNlIHRpbWVzIHRoYXQgd2VyZSBmYXN0ZXIgdGhhbiBhIHByZXNldCBjcml0ZXJpb24gb2YgMjUwbXMgKF9uXz0zIGNoaWxkIHRyaWFscywgX25fPTk3IGFkdWx0IHRyaWFscykgYW5kIHJldGFpbmVkIHBhcnRpY2lwYW50cyByZWdhcmRsZXNzIG9mIHNraXBwZWQgdHJpYWxzIChfbl89NTUgY2hpbGQgdHJpYWxzLCBfbl89MSBhZHVsdCB0cmlhbCkuIE92ZXJhbGwsIG9ubHkgMSUgb2YgYWR1bHQgdHJpYWxzIGFuZCAxJSBvZiBjaGlsZCB0cmlhbHMgd2VyZSBtaXNzaW5nIGRhdGE7IGluIHRoZXNlIGNhc2VzLCB3ZSBpbXB1dGVkIG1pc3NpbmcgdmFsdWVzIHVzaW5nIHRoZSBtZWRpYW4gYnkgdGFyZ2V0IGNoYXJhY3RlciwgY2FwYWNpdHksIGFuZCBhZ2UgZ3JvdXAuCgojIyBSZXN1bHRzCgojIyMgQ29uY2VwdHVhbCBzdHJ1Y3R1cmU6IEFkdWx0cwoKYGBge3J9CiMgaW1wbGVtZW50IDMgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMKbmZhY3RfcGFyX2QxX2FkIDwtIGZhLnBhcmFsbGVsKGQxX2FkX3dpZGVfaSwgY29yID0gY2hvc2VuX2NvciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSkkbmZhY3QKbmZhY3RfYmljX2QxX2FkIDwtIHZzcyhkMV9hZF93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIHJvdGF0ZSA9IGNob3Nlbl9yb3QsIAogICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtKSR2c3Muc3RhdHMkQklDICU+JSB3aGljaC5taW4oKQpuZmFjdF93ZG1fZDFfYWQgPC0gcmV0ZW5fZnVuKGQxX2FkX3dpZGVfaSwgcm90X3R5cGUgPSBjaG9zZW5fcm90KQoKY2F0KCJQYXJhbGxlbCBhbmFseXNpczogIiwgbmZhY3RfcGFyX2QxX2FkLAogICAgIlxuTWluaW1pemluZyBCSUM6ICIsIG5mYWN0X2JpY19kMV9hZCwKICAgICJcbldlaXNtYW4gZXQgYWwuOiAiLCBuZmFjdF93ZG1fZDFfYWQpCmBgYAoKVHdvIG9yIG91ciB0aHJlZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbiAobWluaW1pemluZyBCSUMgYW5kIFdlaXNtYW4gZXQgYWwuJ3MgZmFjdG9yIHJldGVudGlvbiBjcml0ZXJpYSkgc3VnZ2VzdGVkIHJldGFpbmluZyB0aHJlZSBmYWN0b3JzLiAoUGFyYWxsZWwgYW5hbHlzaXMgc3VnZ2VzdGVkIHJldGFpbmluZyBmb3VyIGZhY3RvcnM7IHNlZSBTT00uKQoKYGBge3J9CmVmYV8zX2QxX2FkIDwtIGZhX2Z1bihkMV9hZF93aWRlX2ksIDMpCmVmYV8zX3Bsb3RfZDFfYWQgPC0gaGVhdG1hcF9mdW4oZWZhXzNfZDFfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIkhFQVJUIiwgIkJPRFkiLCAiTUlORCIpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiQWR1bHRzIChuPSIsIG5yb3coZDFfYWRfd2lkZV9pKSwgIikiKSkKYGBgCgpBZnRlciByb3RhdGlvbiwgdGhlIGZpcnN0IGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIGNhcGFjaXRpZXMgZm9yIHNlbGYtIGFuZCBvdGhlci1yZWxldmFudCBlbW90aW9uc+KAlGEgc3VpdGUgb2YgY2FwYWNpdGllcyB0aGF0IHdlIChmb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4pIHdpbGwgcmVmZXIgdG8gYXMgX0hFQVJUXy4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QxX2FkLCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMV9hZCRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLgoKVGhlIHNlY29uZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgcmVsYXRlZCB0byBiaW9sb2dpY2FsIG5lZWRz4oCUYSBzdWl0ZSBvZiBjYXBhY2l0aWVzIHRoYXQgd2UgKGZvbGxvd2luZyBXZWlzbWFuIGV0IGFsLikgd2lsbCByZWZlciB0byBhcyBfQk9EWV8uIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMV9hZCwgNCwgIkYyIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDFfYWQkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjIiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gCgpUaGUgdGhpcmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIHRvIGRldGVjdCBhbmQgdXNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbnZpcm9ubWVudOKAlGEgc3VpdGUgb2YgY2FwYWNpdGllcyB0aGF0IHdlIChmb2xsb3dpbmcgV2Vpc21hbiBldCBhbC4pIHdpbGwgcmVmZXIgdG8gYXMgX01JTkRfLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDFfYWQsIDQsICJGMyIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QxX2FkJFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYzIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uICAKClNlZSBGaWd1cmUgMSBmb3IgYWxsIGZhY3RvciBsb2FkaW5ncy4gKE5vdGUgdGhhdCBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kgYWNyb3NzIHN0dWRpZXMgYW5kIGNvbXBhcmlzb24gd2l0aCBXZWlzbWFuIGV0IGFsLidzIHdvcmssIHdlIGhhdmUgcGxvdHRlZCB0aGVzZSBmYWN0b3JzIGluIHRoZSBzYW1lIG9yZGVyIGZvciBhbGwgc3R1ZGllczogX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfLikKCkluIHN1bSwgYXMgV2Vpc21hbiBldCBhbC4ncyBvcmlnaW5hbCBzdHVkaWVzLCBhIHRocmVlLWZhY3RvciBzdHJ1Y3R1cmUgZW1lcmdlZCBmcm9tIGFkdWx0cycgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucywgY2hhcmFjdGVyaXplZCBieSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gYm9keSwgaGVhcnQsIGFuZCBtaW5kLiBUaGlzIHN1Z2dlc3RzIHRoYXQgb3VyIGNoaWxkLWZyaWVuZGx5IHBhcmFkaWdtIHdhcyB2YWxpZDogVXNpbmcgcmV3b3JkZWQgaXRlbXMgYW5kIGEgdGhyZWUtcG9pbnQgcmVzcG9uc2Ugc2NhbGUgZWxpY2l0ZWQgdGhlIHNhbWUgaW50dWl0aXZlIG9udG9sb2d5IG9mIG1lbnRhbCBsaWZlLCBhbW9uZyBhZHVsdHMsIHRoYXQgaGFzIGJlZW4gcmV2ZWFsZWQgYnkgbW9yZSBjb21wbGV4LCAiYWR1bHQtZnJpZW5kbHkiIGV4cGVyaW1lbnRhbCBwYXJhZGlnbXMuIAoKIyMjIENvbmNlcHR1YWwgc3RydWN0dXJlOiBDaGlsZHJlbiAoNy05eSkKCmBgYHtyfQojIGltcGxlbWVudCAzIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzCm5mYWN0X3Bhcl9kMV83OSA8LSBmYS5wYXJhbGxlbChkMV83OV93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0pJG5mYWN0Cm5mYWN0X2JpY19kMV83OSA8LSB2c3MoZDFfNzlfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCByb3RhdGUgPSBjaG9zZW5fcm90LCAKICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSkkdnNzLnN0YXRzJEJJQyAlPiUgd2hpY2gubWluKCkKbmZhY3Rfd2RtX2QxXzc5IDwtIHJldGVuX2Z1bihkMV83OV93aWRlX2ksIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKCmNhdCgiUGFyYWxsZWwgYW5hbHlzaXM6ICIsIG5mYWN0X3Bhcl9kMV83OSwKICAgICJcbk1pbmltaXppbmcgQklDOiAiLCBuZmFjdF9iaWNfZDFfNzksCiAgICAiXG5XZWlzbWFuIGV0IGFsLjogIiwgbmZhY3Rfd2RtX2QxXzc5KQpgYGAKCk91ciB0aHJlZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbiBhbGwgc3VnZ2VzdGVkIHJldGFpbmluZyB0aHJlZSBmYWN0b3JzLgoKYGBge3J9CmVmYV8zX2QxXzc5IDwtIGZhX2Z1bihkMV83OV93aWRlX2ksIDMpCgplZmFfM19wbG90X2QxXzc5IDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QxXzc5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJIRUFSVCIsICJCT0RZIiwgIk1JTkQiKSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZTAoIkNoaWxkcmVuIDctOXkgKG49IiwgbnJvdyhkMV83OV93aWRlX2kpLCAiKSIpKSArCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpCmBgYAoKYGBge3J9CmNvbmdfZWZhXzNfZDFfYWRfNzkgPC0gZmEuY29uZ3J1ZW5jZShlZmFfM19kMV83OSRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV8zX2QxX2FkJGxvYWRpbmdzKQpgYGAKCkFmdGVyIHJvdGF0aW9uLCB0aGUgZmlyc3QgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfSEVBUlRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QxX2FkXzc5WyJGMSIsICJGMSJdYDsgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDFfYWRfNzlbIkYxIiwgIkYyIl1gOyB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kMV9hZF83OVsiRjEiLCAiRjMiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDFfNzksIDQsICJGMSIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QxXzc5JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYxIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHNlY29uZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfQk9EWV8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kMV9hZF83OVsiRjIiLCAiRjIiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMV9hZF83OVsiRjIiLCAiRjEiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8zX2QxX2FkXzc5WyJGMiIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfM19kMV83OSwgNCwgIkYyIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzNfZDFfNzkkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjIiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gCgpUaGUgdGhpcmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX01JTkRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDFfYWRfNzlbIkYzIiwgIkYzIl1gOyB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzNfZDFfYWRfNzlbIkYzIiwgIkYxIl1gOyB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kMV9hZF83OVsiRjMiLCAiRjIiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDFfNzksIDQsICJGMyIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QxXzc5JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYzIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIChTZWUgRmlndXJlIDEgZm9yIGFsbCBmYWN0b3IgbG9hZGluZ3MuKQoKSW4gc3VtLCBsaWtlIGFkdWx0cywgY2hpbGRyZW4ncyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIHdlcmUgZG9taW5hdGVkIGJ5IGEgdGhyZWUtd2F5IGRpc3RpbmN0aW9uIGJldHdlZW4gcGh5c2lvbG9naWNhbCwgc29jaWFsLWVtb3Rpb25hbCwgYW5kIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllc+KAlGkuZS4sIGJvZHksIGhlYXJ0LCBhbmQgbWluZC4KCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuNjd9CmZpZzAxX3Bsb3RzIDwtIHBsb3RfZ3JpZChlZmFfM19wbG90X2QxXzc5LCBlZmFfM19wbG90X2QxX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3dpZHRocyA9IGMoMC44NSwgMSksIGxhYmVscyA9IGMoIkEiLCAiQiIpKQpmaWcwMV93aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwMV9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSAxOiBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgcmVzdWx0cyBmb3IgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiAoQSkgYW5kIGFkdWx0cyAoQikgaW4gU3R1ZHkgMSwgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHR3byB0YXJnZXQgZW50aXRpZXM6IGEgYmVldGxlIG9yIGEgcm9ib3QuIiwgMTQzKSwgeCA9IDAsIGhqdXN0ID0gMCkKZ2dkcmF3KGZpZzAxX3dpdGhfY2FwdGlvbikKYGBgCgojIyMgQXR0cmlidXRpb25zIG9mIG1lbnRhbCBsaWZlOiBjaGlsZHJlbiB2cy4gYWR1bHRzCgpUaGUgZmFjdG9yIGFuYWx5c2VzIG9mIGNvcnJlbGF0aW9ucyBhbW9uZyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGp1c3QgZGVzY3JpYmVkIHNoZWQgbGlnaHQgb24gb25lIGFzcGVjdCBvZiBjaGlsZHJlbidzIGNvbmNlcHRzIG9mIG1lbnRhbCBsaWZlOiBpdHMgb250b2xvZ2ljYWwgc3RydWN0dXJlLiBUaGUgZGVzaWduIG9mIG91ciBzdHVkeSBhbHNvIGFsbG93cyB1cyB0byBsb29rIGF0IGEgc2Vjb25kIGFzcGVjdCBvZiBjb25jZXB0dWFsIGRldmVsb3BtZW50IGluIHRoaXMgZG9tYWluOiBjaGlsZHJlbidzIGFwcGxpY2F0aW9uIG9mIHRoaXMgY29uY2VwdCwgaS5lLiwgd2hpY2ggbWVudGFsIGNhcGFjaXRpZXMgdGhleSB0ZW5kIHRvIGF0dHJpYnV0ZSBvciBub3QgdG8gYXR0cmlidXRlIHRvIHRoZSBkaWZmZXJlbnQgdGFyZ2V0IGNoYXJhY3RlcnMuIEhvdyBtaWdodCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjYXBhY2l0aWVzIHJlbGF0ZWQgdG8gX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHZhcnkgYWNyb3NzIG1pZGRsZSBjaGlsZGhvb2QgKDctOXkpLCBhbmQgaG93IGRvIHRoZXkgY29tcGFyZSB0byB0aGUgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBvZiBhZHVsdHM/CgpXZSBhcHByb2FjaGVkIHRoaXMgcXVlc3Rpb24gZnJvbSBzZXZlcmFsIGFuZ2xlcy4KCmBgYHtyfQpkMV9hbGxfd2lkZV9pIDwtIGQxX2FkX3dpZGVfaSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBmdWxsX2pvaW4oZDFfNzlfd2lkZV9pICU+JQogICAgICAgICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfY2hhciIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkX2NoYXIiKQpgYGAKCmBgYHtyfQplZmFfM19kMV83OV9wcm9qZWN0X3Njb3JlcyA8LSBwcmVkaWN0KG9iamVjdCA9IGVmYV8zX2QxX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkMV83OV93aWRlX2ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLmRhdGEgPSBkMV9hZF93aWRlX2kpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkX2NoYXIiKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfLiokIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBjaGFyYWN0ZXIgPSBnc3ViKCJeLipfIiwgIiIsIHN1YmlkX2NoYXIpKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLWMoc3ViaWQsIGNoYXJhY3Rlciwgc3ViaWRfY2hhcikpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYyIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMSIgPSAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYzIiA9ICJNSU5EIikpICU+JQogIGFycmFuZ2Uoc3ViaWRfY2hhcikKYGBgCgpGaXJzdCwgd2UgcHJvamVjdGVkIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIGludG8gdGhlIGZhY3RvciBzcGFjZSBkZWZpbmVkIGJ5IGFkdWx0cyAoc3RhbmRhcmRpemVkIGluIHRlcm1zIG9mIGFkdWx0cycgcmVzcG9uc2VzKSwgYW5kIGV4YW1pbmVkIGZhY3RvciBzY29yZXMgYnkgYWdlIGdyb3VwICh1c2luZyB0aGUgY29ycmVsYXRpb24tcHJlc2VydmluZyBtZXRob2QgYXJ0aWN1bGF0ZWQgYnkgdGVuIEJlcmdlLCBLcmlqbmVuLCBXYW5zYmVlaywgJiBTaGFwaXJvLCAxOTk5LCBhcyBpbXBsZW1lbnRlZCBpbiB0aGUgInBzeWNoIiBwYWNrYWdlIGZvciBSLCBSZXZlbGxlLCAyMDE4KS4gVGhpcyB5aWVsZGVkIHRocmVlIHNjb3JlcyBmb3IgZWFjaCBwYXJ0aWNpcGFudCwgY29ycmVzcG9uZGluZywgaW4gcHJpbmNpcGxlLCB0byBob2xpc3RpYyBqdWRnbWVudHMgb2YgdGhlIHNvY2lhbC1lbW90aW9uYWwsIHBoeXNpb2xvZ2ljYWwsIGFuZCBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMgb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXIgdGhlIHBhcnRpY2lwYW50IGV2YWx1YXRlZC4gKE5vdGUgdGhhdCBlYWNoIG9mIHRoZXNlIHRocmVlIHNjb3JlcyB0YWtlcyBpbnRvIGFjY291bnQgZmFjdG9yIGxvYWRpbmdzIGZvciBhbGwgNDAgbWVudGFsIGNhcGFjaXRpZXMsIGFzIHNob3duIGluIEZpZ3VyZSAxLikgCgpUaGlzIGFsbG93ZWQgdXMgdG8gZXhhbWluZSB0aGUgZWZmZWN0cyBvZiBhZ2UgZ3JvdXAgKGFkdWx0LCBjaGlsZCksIGNoYXJhY3RlciAoYmVldGxlLCByb2JvdCksIGFuZCBmYWN0b3IgKF9CT0RZXywgX0hFQVJUXywgX01JTkRfKSBvbiB0aGVzZSBzY29yZXMgdmlhIG1peGVkIGVmZmVjdHMgQmF5ZXNpYW4gcmVncmVzc2lvbi4gU2VlIFRhYmxlIDEgZm9yIHRoZSByZXN1bHRzIG9mIGEgbWF4aW1hbCBtb2RlbCBhbmQgRmlndXJlIDIgZm9yIHNjb3JlcyBieSBhZ2UgZ3JvdXAsIGFnZSAoZm9yIGNoaWxkcmVuKSwgZmFjdG9yLCBhbmQgY2hhcmFjdGVyLiAKCmBgYHtyfQplZmFfM19zY29yZXNfZDFfYWxsIDwtIGVmYV8zX2QxX2FkJHNjb3JlcyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZF9jaGFyIikgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIC1zdWJpZF9jaGFyKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfYmVldGxlIiwgIiIsIHN1YmlkX2NoYXIpLAogICAgICAgICBzdWJpZCA9IGdzdWIoIl9yb2JvdCIsICIiLCBzdWJpZCksCiAgICAgICAgIGNoYXJhY3RlciA9IGdzdWIoIl4uKl8iLCAiIiwgc3ViaWRfY2hhciksCiAgICAgICAgIGFnZV9ncm91cCA9ICJhZHVsdHMiLAogICAgICAgICBmYWN0b3JfbmFtZSA9IHJlY29kZV9mYWN0b3IoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYyIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGMSIgPSAiSEVBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYzIiA9ICJNSU5EIikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGZ1bGxfam9pbihlZmFfM19kMV83OV9wcm9qZWN0X3Njb3JlcyAlPiUgCiAgICAgICAgICAgICAgbGVmdF9qb2luKGQxXzc5ICU+JSBkaXN0aW5jdChzdWJpZCwgYWdlX2dyb3VwLCBhZ2UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoImZhY3RvciIpLCBjaGFyYWN0ZXIsIGFnZV9ncm91cCksIGZ1bnMoZmFjdG9yKSkKCmVmYV8zX3Njb3Jlc19ib290X2QxX2FsbCA8LSBlZmFfM19zY29yZXNfZDFfYWxsICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCwgZmFjdG9yLCBmYWN0b3JfbmFtZSwgY2hhcmFjdGVyKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJzY29yZSIpICU+JQogIHVuZ3JvdXAoKQpgYGAKCmBgYHtyfQpjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QxX2FsbCRjaGFyYWN0ZXIpIDwtIGNiaW5kKCJSX0dNIiA9IGMoLTEsIDEpKQpjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QxX2FsbCRhZ2VfZ3JvdXApIDwtIGNiaW5kKCJDSDc5X0dNIiA9IGMoLTEsIDEpKQpjb250cmFzdHMoZWZhXzNfc2NvcmVzX2QxX2FsbCRmYWN0b3JfbmFtZSkgPC0gY2JpbmQoIkhfR00iID0gYygtMSwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTV9HTSIgPSBjKC0xLCAwLCAxKSkKCmVmYV8zX3Njb3Jlc19yX2QxX2FsbCA8LSBicm0oc2NvcmUgfiBmYWN0b3JfbmFtZSAqIGFnZV9ncm91cCAqIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDF8c3ViaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlZmFfM19zY29yZXNfZDFfYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQgPSAxMjM0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjk5KSkKCnN1bW1hcnkoZWZhXzNfc2NvcmVzX3JfZDFfYWxsKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgcmVzdWx0cyA9ICJhc2lzIn0KZml4ZWYoZWZhXzNfc2NvcmVzX3JfZDFfYWxsKSAlPiUgCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiUGFyYW1ldGVyIikgJT4lCiAgbXV0YXRlKFBhcmFtZXRlciA9IHJlY29kZV9mYWN0b3IoUGFyYW1ldGVyLAogICAgIkludGVyY2VwdCIgPSAiKEludGVyY2VwdCkiLAogICAgImNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciAocm9ib3QgdnMuIGdyYW5kIG1lYW4pIiwKICAgICJmYWN0b3JfbmFtZUhfR00iID0gIkhFQVJUICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lTV9HTSIgPSAiTUlORCAodnMuIGdyYW5kIG1lYW4pIiwKICAgICJhZ2VfZ3JvdXBDSDc5X0dNIiA9ICJhZ2UgZ3JvdXAgKGNoaWxkcmVuIHZzLiBncmFuZCBtZWFuKSIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBIRUFSVCIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBNSU5EIiwKICAgICJhZ2VfZ3JvdXBDSDc5X0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBhZ2UgZ3JvdXAiLAogICAgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0dNIiA9ICJIRUFSVCDDlyBhZ2UgZ3JvdXAiLAogICAgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0dNIiA9ICJNSU5EIMOXIGFnZSBncm91cCIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFnZV9ncm91cENINzlfR006Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIEhFQVJUIMOXIGFnZSBncm91cCIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmFnZV9ncm91cENINzlfR006Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIE1JTkQgw5cgYWdlIGdyb3VwIikpICU+JQogIGFycmFuZ2UoUGFyYW1ldGVyKSAlPiUKICBtdXRhdGUoWCA9IGlmZWxzZShRMi41ICogUTk3LjUgPiAwLCAiKiIsICIiKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLVBhcmFtZXRlciwgLVgpLCAKICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSkgJT4lCiAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgRXJyb3IgPSBFc3QuRXJyb3IsICIgIiA9IFgpICU+JQogIHVuaXRlKGA5NSUgQ0lgLCBRMi41LCBROTcuNSwgc2VwID0gIiwgIikgJT4lCiAgbXV0YXRlKGA5NSUgQ0lgID0gcGFzdGUwKCJbIiwgYDk1JSBDSWAsICJdIikpICU+JQogIGtuaXRyOjprYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcCgiciIsIDMpKSwKICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSAxOiBGaXhlZCBlZmZlY3RzIGZyb20gYSBtaXhlZC1lZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24gbW9kZWwgcHJlZGljdGluZyBmYWN0b3Igc2NvcmVzIGluIFN0dWR5IDEgYnkgY2hhcmFjdGVyIChiZWV0bGUsIHJvYm90KSwgZmFjdG9yIChCT0RZLCBIRUFSVCwgTUlORCksIGFuZCBhZ2UgZ3JvdXAgKGFkdWx0cywgY2hpbGRyZW4pLiBUaGUgbW9kZWwgdXNlZCB0aGUgZm9ybXVsYSAnZmFjdG9yIHNjb3JlIH4gZmFjdG9yICogYWdlIGdyb3VwICogY2hhcmFjdGVyICsgKDEgfCBzdWJqZWN0KScgYW5kIHdhcyBpbXBsZW1lbnRlZCBpbiB0aGUgJ2JybXMnIHBhY2thZ2UgZm9yIFIgKELDvHJrbmVyLCAyMDE3KS4gQWxsIHZhcmlhYmxlcyB3ZXJlIGVmZmVjdC1jb2RlZC4gQXN0ZXJpc2tzIG1hcmsgcGFyYW1ldGVycyB3aG9zZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZG9lcyBub3QgaW5jbHVkZSAwLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCkNvbGxhcHNpbmcgYWNyb3NzIGFnZSBncm91cHMgYW5kIGZhY3RvcnMsIGZhY3RvciBzY29yZXMgc3VnZ2VzdCB0aGF0IHBhcnRpY2lwYW50cyBnZW5lcmFsbHkgYXR0cmlidXRlZCBmZXdlciBtZW50YWwgY2FwYWNpdGllcyB0byB0aGUgcm9ib3QgdGhhbiB0aGUgYmVldGxlIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QxX2FsbCwgImNoYXJhY3RlclJfR00iKWApLiBIb3dldmVyLCB0aGlzIGFwcGVhcnMgdG8gYmUgZW50aXJlbHkgZHVlIHRvIHRoZSBodWdlIGRpc2NyZXBhbmN5IGJldHdlZW4gY2hhcmFjdGVycyBpbiB0aGUgX0JPRFlfIGRvbWFpbjsgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjaGFyYWN0ZXJzIHdhcyByZWR1Y2VkIHRvIG5vdGhpbmcgaW4gdGhlIF9IRUFSVF8gZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QxX2FsbCwgImZhY3Rvcl9uYW1lSF9HTTpjaGFyYWN0ZXJSX0dNIilgKSwgYW5kIHJldmVyc2VkIGluIHRoZSBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBkb21haW4gKGByIHdyaXRlX2JfOTVDSV9mdW4oZWZhXzNfc2NvcmVzX3JfZDFfYWxsLCAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlclJfR00iKWApLiBDb2xsYXBzaW5nIGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVycywgY2hpbGRyZW4gdGVuZGVkIHRvIGF0dHJpYnV0ZSBtb3JlIG1lbnRhbCBjYXBhY2l0aWVzIGFkdWx0cyAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kMV9hbGwsICJhZ2VfZ3JvdXBDSDc5X0dNIilgKSwgYnV0IHRoaXMgd2FzIGRyaXZlbiBwcmltYXJpbHkgYnkgdGhlIHNvY2lhbC1lbW90aW9uYWwgZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QxX2FsbCwgImZhY3Rvcl9uYW1lSF9HTTphZ2VfZ3JvdXBDSDc5X0dNIilgKSwgYW5kIHdhcyByZXZlcnNlZCBpbiB0aGUgcGVyY2VwdHVhbC1jb2duaXRpdmUgZG9tYWluIChgciB3cml0ZV9iXzk1Q0lfZnVuKGVmYV8zX3Njb3Jlc19yX2QxX2FsbCwgImZhY3Rvcl9uYW1lTV9HTTphZ2VfZ3JvdXBDSDc5X0dNIilgKS4gCgpgYGB7cn0KZmlnMDJfcGxvdCA8LSBnZ3Bsb3QoZWZhXzNfc2NvcmVzX2QxX2FsbCAlPiUgZmlsdGVyKCFpcy5uYShhZ2UpKSwKICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBhZ2UsIHkgPSBzY29yZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBjaGFyYWN0ZXIsIGNvbG9yID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKH4gZmFjdG9yX25hbWUsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjI1LCBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3BvaW50KGRhdGEgPSBlZmFfM19zY29yZXNfZDFfYWxsICU+JSBmaWx0ZXIoYWdlX2dyb3VwID09ICJhZHVsdHMiKSwKICAgICAgICAgICAgIGFlcyh4ID0gMTEpLCBhbHBoYSA9IDAuMiwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShkb2RnZS53aWR0aCA9IDAuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci53aWR0aCA9IDAuMjUpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSBlZmFfM19zY29yZXNfYm9vdF9kMV9hbGwgJT4lIGZpbHRlcihhZ2VfZ3JvdXAgPT0gImFkdWx0cyIpLAogICAgICAgICAgICAgICAgICBhZXMoeCA9IDExLCB5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZhdHRlbiA9IDEuMjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYyg3OjExKSwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjd5IiwgIjh5IiwgIjl5IiwgIjEweSIsICJhZHVsdHMiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwLCAxMCwgMSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygyMSwgMjIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxLCBzaXplID0gMykpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjV9CmZpZzAyX3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZzAyX3Bsb3QsIHN0cl93cmFwKCJGaWd1cmUgMjogRmFjdG9yIHNjb3JlcyBmb3IgYWR1bHRzIGFuZCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWR5IDEsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnQgYXNzZXNzZWQgNDAgbWVudGFsIGNhcGFjaXRpZXMgZm9yIG9uZSBvZiB0d28gdGFyZ2V0IGVudGl0aWVzOiBhIGJlZXRsZSAocmVkIGNpcmNsZXMpIG9yIGEgcm9ib3QgKHR1cnF1b2lzZSBzcXVhcmVzKS4gRWFjaCBwYXJ0aWNpcGFudCByZWNpZXZlZCBhIGZhY3RvciBzY29yZSBmb3IgZWFjaCBmYWN0b3IgKEJPRFksIEhFQVJULCBhbmQgTUlORCwgYXMgZGVmaW5lZCBieSBhbiBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgb2YgYWR1bHRzJyByZXNwb25zZXMpLiBXZSB0cmVhdGVkIHRoZXNlIHNjb3JlcyBhcyBzdW1tYXJpZXMgb2YgdGhhdCBwYXJ0aWNpcGFudHMnIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgaW4gdGhlc2UgZG9tYWluczsgYSBzY29yZSBvZiAwIGNvcnJlc3BvbmRzIHRvIHRoZSBtZWFuIGZvciB0aGF0IGZhY3RvciBhbW9uZyBhZHVsdHMuIExpbmVzIGNvcnJlc3BvbmQgdG8gbGluZWFyIHJlZ3Jlc3Npb25zIGNvbnNpZGVyaW5nIGNoaWxkcmVuJ3Mgc2NvcmVzIGFsb25lLiBFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG9uIGFkdWx0cycgc2NvcmVzLiBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHRoZSB5LWF4aXMgZGlmZmVycyBhY3Jvc3MgcGFuZWxzLiIsIDEzNSksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwMl93aXRoX2NhcHRpb24pCmBgYAoKQSB2aXN1YWwgaW5zcGVjdGlvbiBvZiBGaWd1cmUgMiBjbGFyaWZpZXMgdGhlc2UgZmluZGluZ3MuIEF0dHJpYnV0aW9ucyBpbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gZG9tYWlucyB3ZXJlIHJhdGhlciBzaW1pbGFyIGZvciBjaGlsZHJlbiBhbmQgYWR1bHRzOiBCb3RoIGNoaWxkcmVuIGFuZCBhZHVsdHMgbWFya2VkIGEgY2xlYXIgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGJlZXRsZSBpbiB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBfQk9EWV8gKGxlZnQpLCBpbiBsaW5lIHdpdGggdGhlIGFuaW1hdGXigJNpbmFuaW1hdGUgZGlzdGluY3Rpb247IGFuZCBib3RoIGFnZSBncm91cHMgY3JlZGl0ZWQgdGhlIHJvYm90IHdpdGggc2xpZ2h0bHkgZ3JlYXRlciBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBza2lsbHMgKF9NSU5EXykgdGhhbiB0aGUgYmVldGxlIChyaWdodCkuIEluIGNvbnRyYXN0LCBpbiB0aGUgX0hFQVJUXyBkb21haW4gKGNlbnRlcikgYm90aCB0aGUgYmVldGxlIGFuZCB0aGUgcm9ib3QgcmVjZWl2ZWQgcmF0aGVyIGxvdyBzY29yZXMgYW1vbmcgYWR1bHRzLCBidXQgdmVyeSBoaWdoIHNjb3JlcyBhbW9uZyBjaGlsZHJlbi4KClRoZSByYXcgZGF0YSBmdXJ0aGVyIHN1cHBvcnN0IHRoZXNlIG9ic2VydmF0aW9ucy4gKFNlZSBGaWd1cmUgMyBmb3IgcmF3IGNvdW50cyBvZiBfbm9fLCBfa2luZGFfLCBhbmQgX3llc18gcmVzcG9uc2VzIGZvciBhbGwgaXRlbXMsIGdyb3VwZWQgYnkgZmFjdG9yLCBjaGFyYWN0ZXIsIGFuZCBhZ2UgZ3JvdXAuKSBGb3IgZXhhbXBsZSwgY29uc2lkZXIgaHVuZ2VyICh0aGUgZmlyc3QgY2FwYWNpdHkgdW5kZXIgX0JPRFlfKTogQWNyb3NzIGFnZSBncm91cHMsIG5lYXJseSBldmVyeSBwYXJ0aWNpcGFudCBzYWlkIHRoYXQgYSBiZWV0bGUgY291bGQgZ2V0IGh1bmdyeSwgd2hpbGUgZmV3IHBhcnRpY2lwYW50cyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIHNvbWUgY2hpbGRyZW4pIHNhaWQgdGhhdCBhIHJvYm90IGNvdWxkLiBMaWtld2lzZSwgZm9yIG1hdGhlbWF0aWNhbCBjb21wdXRhdGlvbnMgKHRoZSBsYXN0IGNhcGFjaXR5IHVuZGVyIF9NSU5EXyksIHZpcnR1YWxseSBubyBwYXJ0aWNpcGFudHMgc2FpZCB0aGF0IGEgYmVldGxlIHdhcyBjYXBhYmxlIG9mIGRvaW5nIG1hdGgsIHdoaWxlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGJvdGggYWR1bHRzIGFuZCBjaGlsZHJlbiBzYWlkIHRoYXQgYSByb2JvdCB3YXMuIEJ1dCBmb3Igc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMsIGxpa2UgZmVlbGluZyBwcm91ZCwgZmVlbGluZyBqb3ksIGFuZCBmZWVsaW5nIHNhZCAodGhlIGZpcnN0IHRocmVlIGNhcGFjaXRpZXMgdW5kZXIgX0hFQVJUXyksIGZhciBtb3JlIGNoaWxkcmVuIHRoYW4gYWR1bHRzIGVuZG9yc2VkIHRoZXNlIGNhcGFjaXRpZXMgZm9yIGJlZXRsZXMgYW5kIHJvYm90cy4gKFNlZSBTT00gZm9yIGFuIGFuYWx5c2lzLCBwYXJhbGxlbCB0byB0aGUgcmVncmVzc2lvbiBhbmFseXNlcyBoZXJlLCBvZiB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgdG9wLWxvYWRpbmcgbWVudGFsIGNhcGFjaXRpZXMgZm9yIGVhY2ggZmFjdG9yIHRoYXQgd2VyZSBlbmRvcnNlZCBieSBwYXJ0aWNpcGFudHMgb2YgZGlmZmVyZW50IGFnZXMuKQoKYGBge3J9CmQxX2FsbCA8LSBkMV9hZCAlPiUKICBmdWxsX2pvaW4oZDFfNzkpICU+JQogIHNlbGVjdChhZ2VfZ3JvdXAsIHN1YmlkLCBjaGFyYWN0ZXIsIGNhcGFjaXR5LCByZXNwb25zZV9udW0pICU+JQogIGxlZnRfam9pbihsb2FkaW5nc19mdW4oZWZhXzNfZDFfYWQpICU+JSAKICAgICAgICAgICAgICBncm91cF9ieShjYXBhY2l0eSkgJT4lCiAgICAgICAgICAgICAgdG9wX24oMSwgbG9hZGluZykgJT4lCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgIGFycmFuZ2UoZmFjdG9yLCBkZXNjKGxvYWRpbmcpKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUob3JkZXIgPSAxOjQwKSAlPiUKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIGZhY3Rvciwgb3JkZXIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlX251bSkpICU+JQogIG11dGF0ZShyZXNwb25zZSA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAiID0gIm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjUiID0gImtpbmRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIiA9ICJ5ZXMiKSwKICAgICAgICAgZmFjdG9yID0gcmVjb2RlX2ZhY3RvcihmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYyIiA9ICJCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjEiID0gIkhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRjMiID0gIk1JTkQiKSwKICAgICAgICAgYWdlX2dyb3VwID0gcmVjb2RlX2ZhY3RvcihhZ2VfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNzkiID0gImNoaWxkcmVuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdWx0cyIgPSAiYWR1bHRzIikpCgpmaWcwM19wbG90IDwtIGQxX2FsbCAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKG9yZGVyKSksIAogICAgICAgICAgICAgZmlsbCA9IGNoYXJhY3RlciwgYWxwaGEgPSByZXNwb25zZSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGZhY3RvciksIGNvbHMgPSB2YXJzKGNoYXJhY3RlciwgYWdlX2dyb3VwKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAic3RhY2siKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuN30KZmlnMDNfd2l0aF9jYXB0aW9uIDwtIGFkZF9zdWIoZmlnMDNfcGxvdCwgc3RyX3dyYXAoIkZpZ3VyZSAzOiBSYXcgY291bnRzIG9mIHJlc3BvbnNlcyBvZiAneWVzJyAoZGFyayksICdraW5kYScgKG1lZGl1bSksIG9yICdubycgKGxpZ2h0KSBmb3IgYWxsIG1lbnRhbCBjYXBhY2l0eSBpdGVtcywgZ3JvdXBlZCBieSB0aGUgZmFjdG9yIG9uIHdoaWNoIHRoZXkgbG9hZGluZyBtb3N0IHBvc2l0aXZlbHkgKEJPRFksIEhFQVJULCBNSU5EKSBhY2NvcmRpbmcgdG8gYW4gZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIG9mIGFkdWx0cycgcmVzcG9uc2VzIChTdHVkeSAxKS4gRWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHR3byB0YXJnZXQgZW50aXRpZXM6IGEgYmVldGxlIChyZWQpIG9yIGEgcm9ib3QgKHR1cnF1b2lzZSkuIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4ncyByZXNwb25zZXMgYW5kIGFkdWx0cycgcmVzcG9uc2VzIGFyZSBzaG93biBzZXBhcmF0ZWx5LiIsIDExMiksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwM193aXRoX2NhcHRpb24pCmBgYAoKYGBge3J9CmJpbm9taWFsX3Ntb290aCA8LSBmdW5jdGlvbiguLi4pIHsKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpLCAuLi4pCn0KCmQxX2FsbF9lbmRvcnNlIDwtIGQxX2FsbCAlPiUKICBncm91cF9ieShmYWN0b3IsIHN1YmlkKSAlPiUKICB0b3BfbigtNiwgb3JkZXIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoZW5kb3JzZSA9IGlmZWxzZShyZXNwb25zZV9udW0gPiAwLCAxLCAwKSkgJT4lCiAgZ3JvdXBfYnkoYWdlX2dyb3VwLCBzdWJpZCwgY2hhcmFjdGVyLCBmYWN0b3IpICU+JQogIHN1bW1hcmlzZShwcm9wX2VuZG9yc2UgPSBtZWFuKGVuZG9yc2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgIG4gPSBsZW5ndGgoZW5kb3JzZSkpICU+JQogIHVuZ3JvdXAoKQoKZDFfYWxsX2VuZG9yc2VfYm9vdCA8LSBkMV9hbGxfZW5kb3JzZSAlPiUKICBncm91cF9ieShhZ2VfZ3JvdXAsIGNoYXJhY3RlciwgZmFjdG9yKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJwcm9wX2VuZG9yc2UiKSAlPiUKICB1bmdyb3VwKCkKCmZpZ1NVUFBfcGxvdCA8LSBkMV9hbGxfZW5kb3JzZSAlPiUKICBmaWx0ZXIoYWdlX2dyb3VwID09ICJjaGlsZHJlbiIpICU+JQogIGxlZnRfam9pbihkMV83OSAlPiUgZGlzdGluY3Qoc3ViaWQsIGFnZSkpICU+JQogIGZpbHRlcighaXMubmEoYWdlKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWdlLCB5ID0gcHJvcF9lbmRvcnNlLCAKICAgICAgICAgICAgIGZpbGwgPSBjaGFyYWN0ZXIsIGNvbG9yID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKH4gZmFjdG9yKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjQsIHdpZHRoID0gMCwgaGVpZ2h0ID0gMC4wMykgKwogIGJpbm9taWFsX3Ntb290aChhZXMod2VpZ2h0ID0gbiksIHNob3cubGVnZW5kID0gRikgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsCiAgIyAgICAgICAgICAgICBtZXRob2QuYXJncyA9IGxpc3QoZmFtaWx5ID0gImJpbm9taWFsIikpICsKICBnZW9tX3BvaW50KGRhdGEgPSBkMV9hbGxfZW5kb3JzZSAlPiUgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIiksCiAgICAgICAgICAgICBhZXMoeCA9IDExKSwgYWxwaGEgPSAwLjQsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2UoZG9kZ2Uud2lkdGggPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwLjAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIud2lkdGggPSAwLjI1KSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZDFfYWxsX2VuZG9yc2VfYm9vdCAlPiUgZmlsdGVyKGFnZV9ncm91cCA9PSAiYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gMTEsIHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaG93LmxlZ2VuZCA9IEYsCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDc6MTEpLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiN3kiLCAiOHkiLCAiOXkiLCAiMTB5IiwgImFkdWx0cyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAxLzYpLCBsYWJlbHMgPSAwOjYpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygyMSwgMjIpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxLCBzaXplID0gMykpKSArCiAgbGFicyh5ID0gIm51bWJlciBvZiBpdGVtcyBlbmRvcnNlZCAob3V0IG9mIDYpIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEYsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpmaWdTVVBQX3dpdGhfY2FwdGlvbiA8LSBhZGRfc3ViKGZpZ1NVUFBfcGxvdCwgc3RyX3dyYXAoIkZpZ3VyZSA0OiBQcm9wb3J0aW9uIG9mIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBlbmRvcnNlZCBpbiBlYWNoIGRvbWFpbiAoQk9EWSwgSEVBUlQsIGFuZCBNSU5EKSBieSBhZHVsdHMgYW5kIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgMSwgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCA0MCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHR3byB0YXJnZXQgZW50aXRpZXM6IGEgYmVldGxlIChyZWQgY2lyY2xlcykgb3IgYSByb2JvdCAodHVycXVvaXNlIHNxdWFyZXMpLiBXZSBkZWZpbmVkIGVhY2ggZG9tYWluIGJ5IHRoZSA2IGl0ZW1zIHRoYXQgbG9hZGVkIHRoZSBtb3N0IHBvc2l0aXZlbHkgb24gdGhlIGNvcnJlc3BvbmRpbmcgZmFjdG9yIGluIGFuIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyBvZiBhZHVsdHMnIHJlc3BvbnNlcywgYW5kIHdlIGNvbnNpZGVyZWQgcmVzcG9uc2VzIG9mIGVpdGhlciAneWVzJyBvciAna2luZGEnIChidXQgbm90ICdubycpIHRvIGJlIGVuZG9yc2VtZW50cy4gTGluZXMgY29ycmVzcG9uZCB0byBsb2dpc3RpYyByZWdyZXNzaW9ucyBjb25zaWRlcmluZyBjaGlsZHJlbidzIHNjb3JlcyBhbG9uZS4gRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBjb25maWRlbmNlIGludGVydmFscyBvbiBhZHVsdHMnIHNjb3Jlcy4iLCAxMzIpLCB4ID0gMCwgaGp1c3QgPSAwKQpnZ2RyYXcoZmlnU1VQUF93aXRoX2NhcHRpb24pCmBgYAoKT2YgY291cnNlLCBvdXIgc2FtcGxlIG9mICJjaGlsZHJlbiIgaW5jbHVkZWQgcGFydGljaXBhbnRzIGFzIHlvdW5nIGFzIDcgeWVhcnMgYW5kIHVwIHRvIG5lYXJseSAxMCB5ZWFycyBvZiBhZ2UuIEhvdyBkaWQgYXR0cmlidXRpb25zIHZhcnkgYWNyb3NzIHRoaXMgYWdlIHJhbmdlPyBBIHZpc3VhbCBpbnNwZWN0aW9uIG9mIEZpZ3VyZSAyIHN1Z2dlc3RzIHRoYXQsIGFjcm9zcyBhbGwgdGhyZWUgZG9tYWlucyAoX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfKSwgY2hpbGRyZW4ncyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIHRvIGJlZXRsZXMgYW5kIHJvYm90cyBhcHBlYXJlZCB0byBiZWNvbWUgbW9yZSBhZHVsdC1saWtlIHdpdGggYWdl4oCUYnV0IHdoaWxlIHRoZSBvbGRlc3QgY2hpbGRyZW4gd2VyZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFkdWx0cyBpbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gZG9tYWlucywgZXZlbiB0aGUgb2xkZXN0IGNoaWxkcmVuIGFwcGVhciB0byBoYXZlIGF0dHJpYnV0ZWQgbW9yZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyB0byB0aGVzZSBlbnRpdGllcyB0aGFuIG1vc3QgYWR1bHRzIGRpZC4KCkEgc2VwYXJhdGUgcmVncmVzc2lvbiBvbiBjaGlsZHJlbidzIGZhY3RvciBzY29yZXMgYWxvbmUgY29uZmlybWVkIHRoYXQsIHdoaWxlIGNvbGxhcHNpbmcgYWNyb3NzIGZhY3RvcnMgYW5kIHRhcmdldCBjaGFyYWN0ZXJzIGNoaWxkcmVuJ3Mgb3ZlcmFsbCBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGRpZCBub3QgdmFyeSB3aXRoIGFnZSAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kMV83OSwgImFnZSIpYCksIHJlbGF0aXZlIHRvIHRoZSBncmFuZCBtZWFuIGF0dHJpYnV0aW9ucyBvZiBfSEVBUlRfIGRlY3JlYXNlZCB3aXRoIGFnZSAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kMV83OSwgImZhY3Rvcl9uYW1lSF9HTTphZ2UiKWApIGFuZCBhdHRyaWJ1dGlvbnMgb2YgX01JTkRfIGluY3JlYXNlZCB3aXRoIGFnZSAoYHIgd3JpdGVfYl85NUNJX2Z1bihlZmFfM19zY29yZXNfcl9kMV83OSwgImZhY3Rvcl9uYW1lTV9HTTphZ2UiKWApLiAoU2VlIFRhYmxlIDIgZm9yIHRoZSBmdWxsIHJlc3VsdHMgb2YgdGhpcyBtb2RlbC4pCgpgYGB7cn0KZWZhXzNfc2NvcmVzX3JfZDFfNzkgPC0gYnJtKHNjb3JlIH4gZmFjdG9yX25hbWUgKiBhZ2UgKiBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDF8c3ViaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVmYV8zX3Njb3Jlc19kMV9hbGwgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWdlX2dyb3VwID09ICJjaGlsZHJlbjc5IiwgIWlzLm5hKGFnZSkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoYWdlID0gc2NhbGUoYWdlLCBzY2FsZSA9IEYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQgPSAxMjM0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVzID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45OSkpCgpzdW1tYXJ5KGVmYV8zX3Njb3Jlc19yX2QxXzc5KQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgcmVzdWx0cyA9ICJhc2lzIn0KZml4ZWYoZWZhXzNfc2NvcmVzX3JfZDFfNzkpICU+JSAKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJQYXJhbWV0ZXIiKSAlPiUKICBtdXRhdGUoUGFyYW1ldGVyID0gcmVjb2RlX2ZhY3RvcihQYXJhbWV0ZXIsCiAgICAiSW50ZXJjZXB0IiA9ICIoSW50ZXJjZXB0KSIsCiAgICAiY2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIChyb2JvdCB2cy4gZ3JhbmQgbWVhbikiLAogICAgImZhY3Rvcl9uYW1lSF9HTSIgPSAiSEVBUlQgKHZzLiBncmFuZCBtZWFuKSIsCiAgICAiZmFjdG9yX25hbWVNX0dNIiA9ICJNSU5EICh2cy4gZ3JhbmQgbWVhbikiLAogICAgImFnZSIgPSAiYWdlIChtZWFuLWNlbnRlcmVkKSIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBIRUFSVCIsCiAgICAiZmFjdG9yX25hbWVNX0dNOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBNSU5EIiwKICAgICJhZ2U6Y2hhcmFjdGVyUl9HTSIgPSAiY2hhcmFjdGVyIMOXIGFnZSIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFnZSIgPSAiSEVBUlQgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZU1fR006YWdlIiA9ICJNSU5EIMOXIGFnZSIsCiAgICAiZmFjdG9yX25hbWVIX0dNOmFnZTpjaGFyYWN0ZXJSX0dNIiA9ICJjaGFyYWN0ZXIgw5cgSEVBUlQgw5cgYWdlIiwKICAgICJmYWN0b3JfbmFtZU1fR006YWdlOmNoYXJhY3RlclJfR00iID0gImNoYXJhY3RlciDDlyBNSU5EIMOXIGFnZSIpKSAlPiUKICBhcnJhbmdlKFBhcmFtZXRlcikgJT4lCiAgbXV0YXRlKFggPSBpZmVsc2UoUTIuNSAqIFE5Ny41ID4gMCwgIioiLCAiIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKC1QYXJhbWV0ZXIsIC1YKSwgCiAgICAgICAgICAgIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIDIpLCBuc21hbGwgPSAyKSkpICU+JQogIHJlbmFtZShiID0gRXN0aW1hdGUsIEVycm9yID0gRXN0LkVycm9yLCAiICIgPSBYKSAlPiUKICB1bml0ZShgOTUlIENJYCwgUTIuNSwgUTk3LjUsIHNlcCA9ICIsICIpICU+JQogIG11dGF0ZShgOTUlIENJYCA9IHBhc3RlMCgiWyIsIGA5NSUgQ0lgLCAiXSIpKSAlPiUKICBrbml0cjo6a2FibGUoZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9IGMoImwiLCByZXAoInIiLCAzKSksCiAgICAgICAgICAgICAgIGNhcHRpb24gPSAiVGFibGUgMjogRml4ZWQgZWZmZWN0cyBmcm9tIGEgbWl4ZWQtZWZmZWN0cyBCYXllc2lhbiByZWdyZXNzaW9uIG1vZGVsIHByZWRpY3RpbmcgZmFjdG9yIHNjb3JlcyBpbiBTdHVkeSAxIGJ5IGNoYXJhY3RlciAoYmVldGxlLCByb2JvdCksIGZhY3RvciAoQk9EWSwgSEVBUlQsIE1JTkQpLCBhbmQgZXhhY3QgYWdlIGdyb3VwIChmb3IgY2hpbGRyZW4gb25seSkuIFRoZSBtb2RlbCB1c2VkIHRoZSBmb3JtdWxhICdmYWN0b3Igc2NvcmUgfiBmYWN0b3IgKiBhZ2UgKiBjaGFyYWN0ZXIgKyAoMSB8IHN1YmplY3QpJyBhbmQgd2FzIGltcGxlbWVudGVkIGluIHRoZSAnYnJtcycgcGFja2FnZSBmb3IgUiAoQsO8cmtuZXIsIDIwMTcpLiBBbGwgY2F0ZWdvcmljYWwgdmFyaWFibGVzIHdlcmUgZWZmZWN0LWNvZGVkLCBhbmQgYWdlIHdhcyBtZWFuLWNlbnRlcmVkLiBBc3Rlcmlza3MgbWFyayBwYXJhbWV0ZXJzIHdob3NlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBkb2VzIG5vdCBpbmNsdWRlIDAuIikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKVGFrZW4gdG9nZXRoZXIsIHRoZXNlIGFuYWx5c2VzIGNvbnZlcmdlIHRvIHN1Z2dlc3Qgb25seSBtaW5vciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNoaWxkcmVuIGFuZCBhZHVsdHMgaW4gdGhlaXIgYXR0cmlidXRpb25zIG9mIF9CT0RZXyBhbmQgX01JTkRfIHRvIGJlZXRsZXMgYW5kIHJvYm90c+KAlGJ1dCBhIG1ham9yIGRpZmZlcmVuY2UgaW4gX0hFQVJUXzogUmVsYXRpdmUgdG8gYWR1bHRzLCBjaGlsZHJlbiB0ZW5kZWQgdG8gY3JlZGl0IGJvdGggYmVldGxlcyBhbmQgcm9ib3RzIHdpdGggbXVjaCBncmVhdGVyIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLiAKCiMjIERpc2N1c3Npb24KClN0dWR5IDEgc2hlZCBsaWdodCBvbiB0d28gZGlzdGluY3QgYXNwZWN0cyBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgY2hpbGRyZW4ncyBjb25jcGV0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZTogY29udGludWl0eSBpbiB0aGUgdW5kZXJseWluZyBjb25jZXB0dWFsIF9zdHJ1Y3R1cmVfIGFuZCB2YXJpYWJpbHR5IGluIHRoZSBfYXBwbGljYXRpb25fIG9mIHRoZXNlIGNvbmNlcHRzLiAKCk9uIHRoZSBvbmUgaGFuZCwgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2VzIHN1Z2dlc3RlZCB0aGF0IGJ5IG1pZGRkbGUgY2hpbGRob29kICg3LTl5KSwgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHVuZGVybHlpbmcgVVMgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgbWVudGFsIGxpZmUgaXMgdmVyeSBzaW1pbGFyIHRvIHRoYXQgb2YgVVMgYWR1bHRzLCBhbmNob3JlZCBieSBzdWl0ZXMgb2YgbWVudGFsIGNhcGFjaXRpZXMgcmVsYXRlZCB0byBfQk9EWV8gKHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyksIF9IRUFSVF8gKHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzKSwgYW5kIF9NSU5EXyAocGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzKS4gV2Ugbm90ZSB0aGF0LCBpbiBwcmluY2lwbGUsIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgb3IgYWx0ZXJuYXRpdmUgbGF0ZW50IGZhY3RvcnMgY291bGQgaGF2ZSBlbWVyZ2VkIGZyb20gdGhlIGZhY3RvciBhbmFseXNpcyBvZiBjaGlsZHJlbidzIHJlc3BvbnNlcy4gRm9yIGV4YW1wbGUsIGNoaWxkcmVuIG1pZ2h0IGhhdmUgZGlzdGluZ3Vpc2hlZCBwcmltYXJpbHkgYmV0d2VlbiBpbnRlcm5hbCBleHBlcmllbmNlIGFuZCBleHRlcm5hbCBhY3Rpb24gKEdyYXkgZXQgYWwuLCAyMDA3KSwgb3IgdGhleSBtaWdodCBoYXZlIGRlbW9uc3RyYXRlZCBmaW5lci1ncmFpbmVkIGdyb3VwaW5ncyBvZiBtZW50YWwgY2FwYWNpdGllcyBiYXNlZCBvbiBwaHJhc2luZywgcm90ZSBrbm93bGVkZ2UsIGV0Yy4gSW5zdGVhZCwgdGhlIGxhdGVudCBjb25jZXB0dWFsIHN0cnVjdHVyZSB1bmRlcmx5aW5nIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIGFwcGVhcnMgdG8gYmUgdmVyeSBzaW1pbGFyIHRvIHRoYXQgb2YgYWR1bHRzLCBib3RoIGluIHRoaXMgc3R1ZHkgYW5kIGluIFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIHByZXZpb3VzIHdvcmsuIEluIG90aGVyIHdvcmRzLCBhbnkgZHJhbWF0aWMgZGV2ZWxvcG1lbnRhbCBjaGFuZ2VzIHRvIHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgbGlrZWx5IG9jY3VyIHByaW9yIHRvIHRoZSBhZ2Ugb2YgNyB5ZWFycy4KCk9uIHRoZSBvdGhlciBoYW5kLCBhbmFseXNlcyBvZiBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyB3aXRoaW4gdGhpcyBzaGFyZWQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgc3VnZ2VzdGVkIHRoYXQgdGhlaXIgYXBwbGljYXRpb24gb2YgdGhpcyBjb25jZXB04oCUaW4gcGFydGljdWxhciwgdGhlaXIgYXR0cmlidXRpb25zIG9mIHRoZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyBvZiB0aGUgX0hFQVJUX+KAlG1heSBiZSB1bmRlcmdvaW5nIGNvbnRpbnVpbmcgcmVmaW5lbWVudCB0aHJvdWdoIG1pZGRsZSBjaGlsZGhvb2QuIFRoZSBzcGVjaWZpY2l0eSBvZiB0aGlzIGFnZSBkaWZmZXJlbmNl4oCUd2hpY2ggZW1lcmdlZCBkcmFtYXRpY2FsbHkgaW4gb25lIGRvbWFpbiAoX0hFQVJUXyksIGJ1dCBub3Qgb3RoZXJzIChfQk9EWV8sIF9NSU5EXynigJRzdWdnZXN0cyB0aGF0IHRoaXMgaXMgdW5saWtlbHkgdG8gYmUgZHVlIGVpdGhlciB0byBhIGdlbmVyYWwgdGVuZGVuY3kgdG93YXJkICJtZW50YWxpemluZyIgdGhlc2UgY2hhcmFjdGVycyAob3IgYSBzaW1wbGUgInllcyIgYmlhcykuIEJ1dCBpdHMgZXh0ZW5zaW9uIHRvIGJvdGggYmVldGxlcyBhbmQgcm9ib3RzIHJhaXNlcyBtYW55IHF1ZXN0aW9ucy4gV2l0aCByZWdhcmQgdG8gcm9ib3RzLCBjaGlsZHJlbiBncm93aW5nIHVwIGluIHRoZSAyMXN0IGNlbnR1cnkgbWlnaHQgYmUgY29udmVyZ2luZyBvbiBhIG5ldyB1bmRlcnN0YW5kaW5nIG9mIHRlY2hub2xvZ2ljYWwgImJlaW5ncyIgYXMgaW5hbmltYXRlIG9iamVjdHMgd2l0aCBzb21lIGRlZ3JlZSBvZiBzb2NpYWwtZW1vdGlvbmFsIGxpZmUgKHNlZSBLYWhuLCBHYXJ5LCAmIFNoZW4sIDIwMTMp4oCUYnV0IHRoaXMga2luZCBvZiBoaXN0b3JpY2FsIGNvbmNlcHR1YWwgY2hhbmdlIHdvdWxkIG5vdCBwcmVkaWN0IHRoZSBoaWdoIHJhdGVzIG9mIHNvY2lhbC1lbW90aW9uYWwgYXR0cmlidXRpb25zIHRvIGJlZXRsZXMgdGhhdCB3ZSBvYnNlcnZlZC4gT3VyIGZpbmRpbmdzIGFyZSBwZXJoYXBzIG1vcmUgY29uc2lzdGVudCB3aXRoIGEgZ2VuZXJhbCBvcGVubmVzcyB0byB1bnRyYWRpdGlvbmFsIHNvY2lhbCBwYXJ0bmVycyB0aGF0IGV4dGVuZHMgaW50byBtaWRkbGUgY2hpbGRob29kIChidXQgbm90IGFkdWx0aG9vZCnigJRvciB3aXRoIGEgZGlmZmVyZW5jZSBpbiBjb25zdHJ1YWxzIG9mIHdoYXQgaXQgbWVhbnMgdG8gZmVlbCBwcm91ZCwgaGFwcHksIGd1aWx0eSwgZXRjLiBUbyB3aGF0IGtpbmRzIG9mIGVudGl0aWVzIHdvdWxkIGNoaWxkcmVuIG9mIHRoaXMgYWdlIGRlbnkgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMsIGFuZCBob3cgZG8gdGhleSBkcmF3IHRoaXMgbGluZT8gSG93IHdvdWxkIHlvdW5nZXIgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgX0hFQVJUXyAoYXMgd2VsbCBhcyBfQk9EWV8gYW5kIF9NSU5EXykgY29tcGFyZT8KCiMgU3R1ZHkgMgoKVGhlIGdvYWxzIG9mIFN0dWR5IDIgd2VyZSB0d29mb2xkLiAKCkZpcnN0LCB3ZSBhaW1lZCB0byBleHRlbmQgb3VyIGZpbmRpbmdzIHdpdGggNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAxLCBieSBleHBhbmRpbmcgdGhlIGxpc3Qgb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXJzIHRvIGluY2x1ZGUgbm90IG9ubHkgdGhlIHR3byAiZWRnZSBjYXNlcyIgZnJvbSBTdHVkeSAxIChhIGJlZXRsZSBhbmQgYSByb2JvdCksIGJ1dCBhIGFsc28gYSB3aWRlciByYW5nZSBvZiBhbmltYXRlIGJlaW5ncyAoYSBiaXJkLCBhIGdvYXQsIGFuZCBhbiBlbGVwaGFudCkgYW5kIGluYW5pbWF0ZSBvYmplY3RzIChhIGNvbXB1dGVyLCBhIHRlZGR5IGJlYXIsIGFuZCBhIGRvbGwpLiBJbiBXZWlzbWFuIGV0IGFsLidzIG9yaWdpbmFsIHN0dWRpZXMsIHRoaXMgYXBwcm9hY2ggeWllbGRlZCBhIGhpZ2hseSBzaW1pbGFyIGNvbmNlcHR1YWwgc3RydWN0dXJlIHRvIHRoZSAiZWRnZSBjYXNlIiBhcHByb2FjaCAoV2Vpc21hbiBldCBhbC4sIDIwMTc7IFN0dWR5IDQpLiBXZSByZWFzb25lZCB0aGF0IGlmIHRoaXMgdGhyZWUtcGFydCBjb25jZXB0dWFsIHN0cnVjdHVyZSBpcyBzdGFibGUgYW5kIHJvYnVzdCBieSB0aGUgYWdlIG9mIDctOSB5ZWFycywgaXQgc2hvdWxkIG1hbmlmZXN0IGFtb25nIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gdW5kZXIgdGhlIHNhbWUgcmFuZ2Ugb2YgY29uZGl0aW9ucyB0aGF0IGVsaWNpdCB0aGlzIHN0cnVjdHVyZSBmcm9tIGFkdWx0cy4KClNlY29uZCwgd2UgYWltZWQgdG8gYXNzZXNzIHRoZSBlYXJsaWVyIGRldmVsb3BtZW50IG9mIHRoaXMgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgaW4gYSBncm91cCBvZiB5b3VuZ2VyIGNoaWxkcmVuLiBXZSB0YXJnZXRlZCA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuIGZvciBvdXIgeW91bmdlciBhZ2UgZ3JvdXAgYmVjYXVzZSB0aGlzIGhhcyBiZWVuIGlkZW50aWZpZWQgYXMgYSBwZXJpb2Qgb2YgZHJhbWF0aWMgZGV2ZWxvcG1lbnQgaW4gc2V2ZXJhbCByZWxldmFudCBkb21haW5zLiBNYW55IHN0dWRpZXMgaGF2ZSBkb2N1bWVudGVkIHNoaWZ0cyBpbiBjaGlsZHJlbidzIGFiaWxpdGllcyB0byB0YWtlIG90aGVycycgcGVyc3BlY3RpdmVzLCByZXByZXNlbnQgZmFsc2UgYmVsaWVmcywgYW5kIGludGVncmF0ZSByZXByZXNlbnRhdGlvbnMgb2YgaW50ZW50aW9ucyBhbmQgb3V0Y29tZXMgaW4gZXZhbHVhdGluZyBtb3JhbCByZXNwb25zaWJpbGl0eSAoZm9yIHJldmVpd3MsIHNlZSBGbGF2ZWxsLCAxOTk5OyBXZWxsbWFuLCAyMDE1KS4gVGhlIHByZXNjaG9vbCB5ZWFycyBoYXZlIGFsc28gYmVlbiB0aGUgZm9jdXMgb2YgYSByaWNoIHRyYWRpdGlvbiBvZiB3b3JrIG9uIGxheSBiaW9sb2d5IGFuZCB0aGUgYW5pbWF0ZS1pbmFuaW1hdGUgZGlzdGluY3Rpb24gZXh0ZW5kaW5nIGJhY2sgbmVhcmx5IGEgY2VudHVyeSAoZS5nLiwgQ2FyZXksIDE5ODU7IFIuIEdlbG1hbiwgU3BlbGtlLCAmIE1lY2ssIDE5ODM7IE1lZGluLCBXYXhtYW4sIFdvb2RyaW5nLCAmIFdhc2hpbmF3YXRvaywgMjAxMDsgUGlhZ2V0LCAxOTI5OyBmb3IgYSByZXZpZXcsIHNlZSBTLiBHZWxtYW4gJiBPcGZlciwgMjAwMikuIEFsbCBvZiB0aGVzZSBhY2NvdW50cyBtYWtlIHRoZSBjYXNlIHRoYXQgYmVjb21pbmcgYSBzb3BoaXN0aWNhdGVkIHJlYXNvbmVy4oCUYW5kIHBhcnRpY3VsYXJseSBhIHNvcGhpc3RpY2F0ZWQgc29jaWFsIHJlYXNvbmVy4oCUcmVxdWlyZXMgc3Vic3RhbnRpYWwgcmVmaW5lbWVudCBvZiBvbmUncyByZXByZXNlbnRhdGlvbnMgb2Ygb3RoZXJzJyBleHBlcmllbmNlcywgYmVsaWVmcywgZGVzaXJlcywgYW5kIG5lZWRzLiBNaWdodCB0aGVzZSByZWZpbmVtZW50cyBpbmNsdWRlIHNoaWZ0cyBpbiBjaGlsZHJlbidzIGludHVpdGlvbnMgYWJvdXQgdGhlIGZ1bmRhbWVudGFsIGNvbXBvbmVudHMgb2YgbWVudGFsIGxpZmU/IAoKUGlsb3QgdGVzdGluZyBzdWdnZXN0ZWQgdGhhdCB3b3JraW5nIHdpdGggeW91bmdlciBjaGlsZHJlbiB3b3VsZCByZXF1aXJlIG1ha2luZyBhIGJyaWVmZXIgZXhwZXJpbWVudGFsIHBhcmFkaWdtIHdpdGggZmV3ZXIgdGhhbiB0aGUgNDAgcXVlc3Rpb25zIGluY2x1ZGVkIGluIFN0dWR5IDE7IGxpbWl0aW5nIHRoZSBsaXN0IHRvIDIwIHF1ZXN0aW9ucyBzZWVtZWQgdG8gYWxsb3cgY2hpbGRyZW4gYXMgeW91bmcgYXMgNCB5ZWFycyBvZiBhZ2UgdG8gY29tcGxldGUgdGhlIHN0dWR5IGVhc2lseSBhbmQgd2l0aG91dCBnZXR0aW5nIGJvcmVkIG9yIGZydXN0cmF0ZWQsIHdoaWxlIHN0aWxsIGluY2x1ZGluZyBlbm91Z2ggaXRlbXMgdG8gZW5hYmxlIHVzIHRvIHByb2NlZWQgd2l0aCBvdXIgZXhwbG9yYXRvcnkgImRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiIgYXBwcm9hY2ggdG8gdW5jb3ZlcmluZyBjb25jZXB0dWFsIHN0cnVjdHVyZS4gCgpUbyB2YWxpZGF0ZSB0aGlzIG1vZGlmaWVkIHBhcmFkaWdtLCB3ZSBhbHNvIGluY2x1ZGVkIGEgc2FtcGxlIG9mIGFkdWx0cy4KCiMjIE1ldGhvZAoKIyMjIFBhcnRpY2lwYW50cwoKYHIgbnJvdyhkMl9hZF93aWRlKSArIG5yb3coZDJfNzlfd2lkZSlgIHBlb3BsZSBwYXJ0aWNpcGF0ZWQgaW4gdGhpcyBzdHVkeS4KCmBgYHtyfQojIGRlbW9ncmFwaGljcwpkMl9hZF9nZW5kZXIgPC0gZGVtb19mdW4oZDJfYWQsICJnZW5kZXIiLCAyKQpkMl9hZF9ldGhuaWNpdHkgPC0gZGVtb19mdW4oZDJfYWQsICJldGhuaWNpdHlfY2F0IiwgMikKYGBgCgpBZHVsdHMgKF9uXz1gciBucm93KGQyX2FkX3dpZGUpYCkgcGFydGljaXBhdGVkIHZpYSBBbWF6b24gTWVjaGFuaWNhbCBUdXJrIChNVHVyaykgaW4gU2VwdGVtYmVyIDIwMTguIEFkdWx0IHBhcnRpY2lwYW50cyBoYWQgZ2FpbmVkIGFwcHJvdmFsIGZvciBhdCBsZWFzdCA5NSUgb2YgdGhlaXIgcHJldmlvdXMgd29yayBvbiBNVHVyazsgaGFkIE1UdXJrIGFjY291bnRzIGJhc2VkIGluIHRoZSBVUzsgYW5kIGluZGljYXRlZCB0aGF0IHRoZXkgd2VyZSBhdCBsZWFzdCAxOCB5ZWFycyBvbGQuIEFkdWx0cyB3ZXJlIHBhaWQgXCQwLjQ1IGZvciBhcHByb3hpbWF0ZWx5IDItNCBtaW51dGVzIG9mIHRoZWlyIHRpbWUgKG1lZGlhbiBkdXJhdGlvbjogYHIgc3VtbWFyeShkMl9hZCRkdXJhdGlvbilbIk1lZGlhbiJdICU+JSByb3VuZCgyKWAgbWluKS4gQW4gYWRkaXRpb25hbCAyMiBhZHVsdHMgcGFydGljaXBhdGVkIGJ1dCB3ZXJlIGV4Y2x1ZGVkIGZvciBmYWlsaW5nIHRvIHJlc3BvbmQgc2Vuc2libHkgdG8gYW4gb3Blbi1lbmRlZCBxdWVzdGlvbiBhYm91dCB3aGF0IHRoZXkgaGFkIGJlZW4gYXNrZWQgdG8gZG8gaW4gdGhlIHN0dWR5IChlLmcuLCBjb3B5aW5nIGFuZCBwYXN0aW5nIHRleHQgZnJvbSB0aGUgcXVlc3Rpb24sIHdyaXRpbmcgImdvb2Qgc3R1ZHksIiBvciBkZXNjcmliaW5nIGEgZGlmZmVyZW50IHN0dWR5LCBlLmcuLCAiSSB3cm90ZSBhbiBlc3NheSBhYm91dCBuYXR1cmUiOyBfbl89MTEpIG9yIGZvciBmYWlsaW5nIHRvIHBhc3Mgb25lIG9yIG1vcmUgYXR0ZW50aW9uIGNoZWNrcyAoZS5nLiwgIlBsZWFzZSBzZWxlY3Qgbm8iOyBfbl89MTEpLiBBY2NvcmRpbmcgdG8gc2VsZiByZXBvcnQsIHRoZSBmaW5hbCBhZHVsdCBzYW1wbGUgcmFuZ2VkIGluIGFnZSBmcm9tIGByIHN1bW1hcnkoZDJfYWQkYWdlKVsiTWluLiJdYC1gciBzdW1tYXJ5KGQyX2FkJGFnZSlbIk1heC4iXWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkMl9hZCRhZ2UpWyJNZWRpYW4iXWB5KSBhbmQgaW5jbHVkZWQgc2xpZ2h0bHkgbW9yZSBtZW4gKGByIHJvdW5kKGQyX2FkX2dlbmRlciRwcm9wW2QyX2FkX2dlbmRlciRnZW5kZXI9PSJtIl0sIDIpICogMTAwYCUpIHRoYW4gd29tZW4gKGByIHJvdW5kKGQyX2FkX2dlbmRlciRwcm9wW2QyX2FkX2dlbmRlciRnZW5kZXI9PSJmIl0sIDIpICogMTAwYCUpLiBBZHVsdHMgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIGFzIFdoaXRlIChgciBkMl9hZF9ldGhuaWNpdHkkcHJvcFtkMl9hZF9ldGhuaWNpdHkkZXRobmljaXR5X2NhdD09IndoaXRlIl0gKiAxMDBgJTsgYHIgZDJfYWRfZXRobmljaXR5JHByb3BbZDJfYWRfZXRobmljaXR5JGV0aG5pY2l0eV9jYXQ9PSJtdWx0aSJdICogMTAwYCUgaWRlbnRpZmllZCBhcyBtb3JlIHRoYW4gb25lIHJhY2UvZXRobmljaXR5LCBhbmQgJFxsZXEkIGByIGRhdGEuZnJhbWUoZDJfYWRfZXRobmljaXR5ICU+JSBmaWx0ZXIoIWV0aG5pY2l0eV9jYXQgJWluJSBjKCJ3aGl0ZSIsICJtdWx0aSIpKSkkcHJvcCAlPiUgbWF4KCkgKiAxMDBgJSBhcyBhbnkgb3RoZXIgcmFjZS9ldGhuaWNpdHkpLgoKYGBge3J9CiMgZGVtb2dyYXBoaWNzCmQyXzc5X2dlbmRlciA8LSBkZW1vX2Z1bihkMl83OSwgImdlbmRlciIsIDIpCmQyXzc5X2V0aG5pY2l0eSA8LSBkZW1vX2Z1bihkMl83OSwgImV0aG5pY2l0eSIsIDIpCmQyXzQ2X2dlbmRlciA8LSBkZW1vX2Z1bihkMl80NiwgImdlbmRlciIsIDIpCmQyXzQ2X2V0aG5pY2l0eSA8LSBkZW1vX2Z1bihkMl80NiwgImV0aG5pY2l0eSIsIDIpCmBgYAoKRGF0YSBjb2xsZWN0aW9uIHdpdGggY2hpbGRyZW4gb2NjdXJyZWQgYmV0d2VlbiBKYW51YXJ5LUp1bmUgMjAxNy4gRm9yIG91ciBmYWN0b3IgYW5hbHlzZXMgd2UgZ3JvdXBlZCBjaGlsZHJlbiBpbnRvIHR3byBhZ2UgZ3JvdXBzLCBiZWNhdXNlIEVGQSBpcyBhIGdyb3VwLWxldmVsIGFuYWx5c2lzIG9mIHRoZSBjb25zZW5zdWFsIGNvbmNlcHR1YWwgc3RydWN0dXJlIGFuZCBpcyBub3QgZGVzaWduZWQgdG8gbW9kZWwgY29udGludW91cyBwYXJ0aWNpcGFudC1sZXZlbCB2YXJpYWJsZXMgbGlrZSBleGFjdCBhZ2UuIE91ciBnb2FsIHdpdGggdGhlc2UgYW5hbHlzZXMgd2FzIHRvIGV4YW1pbmUgZGlzY3JldGUgInNuYXBzaG90cyIgb2YgdGhpcyBjb25jZXB0dWFsIHN0cnVjdHVyZSBhdCB0d28gcG9pbnRzIGluIHRoaXMgY29udGludW91cyBkZXZlbG9wbWVudGFsIHRyYWplY3RvcnkuIE91ciBwbGFubmVkIHNhbXBsZSBzaXplIHdhcyAxMjAgb2xkZXIgYW5kIDEyMCB5b3VuZ2VyIGNoaWxkcmVuLCBidXQgd2UgYWxzbyByZXRhaW5lZCBhIGhhbmRmdWwgb2YgZXh0cmEgcGFydGljaXBhbnRzIHdobyBjb21wbGV0ZWQgdGhlIHN0dWR5IG9uIHRoZSBmaW5hbCBkYXkgb2YgZGF0YSBjb2xsZWN0aW9uIGZvciBlYWNoIGdyb3VwLgoKVGhlIGdyb3VwIHRoYXQgd2Ugd2lsbCByZWZlciB0byBhcyAib2xkZXIgY2hpbGRyZW4iIChfbl89YHIgbnJvdyhkMl83OV93aWRlKWApIHJhbmdlZCBpbiBhZ2UgZnJvbSBgciBzdW1tYXJ5KGQyXzc5JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAtYHIgc3VtbWFyeShkMl83OSRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDJfNzkkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgeSksIGFuZCBwYXJ0aWNpcGF0ZWQgYXQgb25lIG9mIHNldmVyYWwgU2FuIEZyYW5jaXNjbyBCYXkgQXJlYSBtdXNldW1zIG9yIGF0IHRoZWlyIHlvdW5nZXIgc2libGluZydzIHByZXNjaG9vbCBiZXR3ZWVuIEp1bHktRGVjZW1iZXIgMjAxNi4gVGhlIHN0dWR5IHRvb2sgbW9zdCBjaGlsZHJlbiB1bmRlciAxMCBtaW51dGVzIHRvIGNvbXBsZXRlIChtZWRpYW4gZHVyYXRpb246IGByIHN1bW1hcnkoZDJfNzkkZHVyYXRpb24pWyJNZWRpYW4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAgbWluKS4gQWNjb3JkaW5nIHRvIHBhcmVudGFsIHJlcG9ydCwgdGhlIHNhbXBsZSBvZiBvbGRlciBjaGlsZHJlbiBpbmNsdWRlZCBzbGlnaHRseSBtb3JlIGJveXMgKGByIGQyXzc5X2dlbmRlciRwcm9wW2QyXzc5X2dlbmRlciRnZW5kZXI9PSJmIl0gKiAxMDBgJSkgdGhhbiBnaXJscyAoYHIgZDJfNzlfZ2VuZGVyJHByb3BbZDJfNzlfZ2VuZGVyJGdlbmRlcj09Im0iXSAqIDEwMGAlOyBgciBkMl83OV9nZW5kZXIkcHJvcFtkMl83OV9nZW5kZXIkZ2VuZGVyPT0iTUlTU0lORyJdICogMTAwYCUgb2YgY2hpbGRyZW4ncyBnZW5kZXIgd2FzIG5vbi1iaW5hcnkgb3IgdW5rbm93bikuIFBhcmVudHMgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIHRoZWlyIGNoaWxkcmVuIGFzIFdoaXRlIChgciBkMl83OV9ldGhuaWNpdHkkcHJvcFtkMl83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0id2hpdGUiXSAqIDEwMGAlKSwgU291dGggQXNpYW4gKGByIGQyXzc5X2V0aG5pY2l0eSRwcm9wW2QyXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJzb3V0aCBvciBzb3V0aGVhc3QgYXNpYW4iXSAqIDEwMGAlLCBtdWx0aXJhY2lhbCAoYHIgZDJfNzlfZXRobmljaXR5JHByb3BbZDJfNzlfZXRobmljaXR5JGV0aG5pY2l0eT09Im11bHRpIl0gKiAxMDBgJSksIG9yIEVhc3QgQXNpYW4gKGByIGQyXzc5X2V0aG5pY2l0eSRwcm9wW2QyXzc5X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJlYXN0IGFzaWFuIl0gKiAxMDBgJSk7ICRcbGVxJCBgciBkYXRhLmZyYW1lKGQyXzc5X2V0aG5pY2l0eSAlPiUgZmlsdGVyKCFldGhuaWNpdHkgJWluJSBjKCJ3aGl0ZSIsICJtdWx0aSIsICJlYXN0IGFzaWFuIiwgInNvdXRoIG9yIHNvdXRoZWFzdCBhc2lhbiIsICJNSVNTSU5HIikpKSRwcm9wICU+JSBtYXgoKSAqIDEwMGAlIG9mIGNoaWxkcmVuIHdlcmUgaWRlbnRpZmllZCBhcyBhbnkgb3RoZXIgcmFjZS9ldGhuaWNpdHksIGFuZCBgciBkMl83OV9ldGhuaWNpdHkkcHJvcFtkMl83OV9ldGhuaWNpdHkkZXRobmljaXR5PT0iTUlTU0lORyJdICogMTAwYCUgb2YgY2hpbGRyZW4ncyByYWNlL2V0aG5pY2l0eSB3YXMgdW5rbm93bikuIAoKIllvdW5nZXIgY2hpbGRyZW4iIChfbl89YHIgbnJvdyhkMl80Nl93aWRlKWApIHJhbmdlZCBpbiBhZ2UgZnJvbSBgciBzdW1tYXJ5KGQyXzQ2JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAtYHIgc3VtbWFyeShkMl80NiRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDJfNDYkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgeSksIGFuZCBwYXJ0aWNpcGF0ZWQgZWl0aGVyIGF0IHRoZWlyIHByZXNjaG9vbCBvciBhdCBhIG11c2V1bTsgdGhlIG1lZGlhbiBzdHVkeSBkdXJhdGlvbiBmb3IgdGhpcyBncm91cCB3YXMgYHIgc3VtbWFyeShkMl80NiRkdXJhdGlvbilbIk1lZGlhbiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYCBtaW4uIEFjY29yZGluZyB0byBwYXJlbnRhbCByZXBvcnQgYW5kIHNjaG9vbCByZWNvcmRzLCB0aGUgc2FtcGxlIG9mIHlvdW5nZXIgY2hpbGRyZW4gaW5jbHVkZWQgcm91Z2hseSB0aGUgc2FtZSBudW1iZXJzIG9mIGdpcmxzIChgciBkMl80Nl9nZW5kZXIkcHJvcFtkMl80Nl9nZW5kZXIkZ2VuZGVyPT0ibSJdICogMTAwYCUpIGFuZCBib3lzIChgciBkMl80Nl9nZW5kZXIkcHJvcFtkMl80Nl9nZW5kZXIkZ2VuZGVyPT0iZiJdICogMTAwYCUpLiBDaGlsZHJlbiB3ZXJlIHByZWRvbWluYW50bHkgaWRlbnRpZmllZCBhcyBtdWx0aXJhY2lhbCAoYHIgZDJfNDZfZXRobmljaXR5JHByb3BbZDJfNDZfZXRobmljaXR5JGV0aG5pY2l0eT09Im11bHRpIl0gKiAxMDBgJSkgb3IgV2hpdGUgKGByIGQyXzQ2X2V0aG5pY2l0eSRwcm9wW2QyXzQ2X2V0aG5pY2l0eSRldGhuaWNpdHk9PSJ3aGl0ZSJdICogMTAwYCU7ICRcbGVxJCBgciBkYXRhLmZyYW1lKGQyXzQ2X2V0aG5pY2l0eSAlPiUgZmlsdGVyKCFldGhuaWNpdHkgJWluJSBjKCJ3aGl0ZSIsICJtdWx0aSIsICJNSVNTSU5HIikpKSRwcm9wICU+JSBtYXgoKSAqIDEwMGAlIG9mIGNoaWxkcmVuIHdlcmUgaWRlbnRpZmllZCBhcyBhbnkgb3RoZXIgcmFjZS9ldGhuaWNpdHksIGFuZCBgciBkMl80Nl9ldGhuaWNpdHkkcHJvcFtkMl80Nl9ldGhuaWNpdHkkZXRobmljaXR5PT0iTUlTU0lORyJdICogMTAwYCUgb2YgY2hpbGRyZW4ncyByYWNlL2V0aG5pY2l0eSB3YXMgdW5rbm93bikuCgpBbiBhZGRpdGlvbmFsIDcgY2hpbGRyZW4gcGFydGljaXBhdGVkIGJ1dCB3ZXJlIGV4Y2x1ZGVkIGZvciBiZWluZyBvdXRzaWRlIHRoZSB0YXJnZXQgYWdlIHJhbmdlcy4gQ2hpbGRyZW4gcmVjZWl2ZWQgYSBzbWFsbCB0aGFuay15b3UgZ2lmdCAoZS5nLiwgYSBzdGlja2VyKSBmb3IgdGhlaXIgcGFydGljaXBhdGlvbi4gCgojIyMgTWF0ZXJpYWxzIGFuZCBwcm9jZWR1cmUKClBhcnRpY2lwYW50cyB3ZXJlIGFzc2lnbmVkIHRvIGV2YWx1YXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRhcmdldCBlbnRpdGllczogYW4gZWxlcGhhbnQsIGEgZ29hdCwgYSBtb3VzZSwgYSBiaXJkLCBhIGJlZXRsZSwgYSB0ZWRkeSBiZWFyLCBhIGRvbGwsIGEgcm9ib3QsIG9yIGEgY29tcHV0ZXIgKG49WFgtWFggcGVyIGNoYXJhY3RlciwgcGVyIGFnZSBncm91cCkuIFRoaXMgYWxsb3dlZCB1cyB0byBhZGRyZXNzIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb246IFdoZW4gdGFyZ2V0IGVudGl0aWVzIGFyZSBwZXJjZWl2ZWQgdG8gdmFyeSBpbiB0aGVpciBtZW50YWwgY2FwYWNpdHkgcHJvZmlsZXMsIHdoaWNoIGNhcGFjaXRpZXMgImdvIHRvZ2V0aGVyIj8KClBhcnRpY2lwYW50cyB3ZXJlIGFzc2lnbmVkIHRvIHRhcmdldCBjaGFyYWN0ZXJzIHJhbmRvbWx5LCB3aXRoIHR3byBleGNlcHRpb25zOiBUaGUgZG9sbCBhbmQgdGVkZHkgYmVhciBjb25kaXRpb25zIHdlcmUgcnVuIGxhc3QgZm9yIG9sZGVyIGNoaWxkcmVuIChidXQgaW5jbHVkZWQgaW4gdGhlIGluaXRpYWwgcmFuZG9taXphdGlvbiBzY2hlbWUgZm9yIGFkdWx0cyBhbmQgeW91bmdlciBjaGlsZHJlbik7IGFuZCB0b3dhcmQgdGhlIGVuZCBvZiBkYXRhIGNvbGxlY3Rpb24gY2hpbGRyZW4gd2VyZSBhc3NpZ25lZCB0byBjb25kaXRpb25zIHRoYXQgaGFkIHRoZSBmZXdlc3QgcGFydGljaXBhbnRzLiBBcyBpbiBTdHVkeSAxLCBhIHZpdmlkLCBoaWdoLXJlc29sdXRpb24gcGhvdG8gb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gYSBuYXR1cmFsaXN0aWMgY29udGV4dCB3YXMgdmlzaWJsZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBzdHVkeS4gCgpJbnN0cnVjdGlvbnMgd2VyZSBpZGVudGljYWwgdG8gU3R1ZHkgMS4gUGFydGljaXBhbnRzIHJhdGVkIHRoZSB0YXJnZXQgY2hhcmFjdGVyIG9uIDIwIG1lbnRhbCBjYXBhY2l0aWVzLCBwcmVzZW50ZWQgaW4gYSByYW5kb20gb3JkZXIgZm9yIGVhY2ggcGFydGljaXBhbnQuIE9uIGVhY2ggdHJpYWwsIHBhcnRpY2lwYW50cyByZXNwb25kZWQgX25vXywgX2tpbmRhXywgb3IgX3llc18gdG8gdGhlIHF1ZXN0aW9uICJEbyB5b3UgdGhpbmsgYSBbYmVldGxlXSBjYW7igKY/IiBBcyBpbiBTdHVkeSAxLCBhZHVsdHMgY29tcGxldGVkIHRoZSBzdHVkeSBieSBjbGlja2luZyB0aHJvdWdoIGEgd2Vic2l0ZSBhdCB0aGVpciBvd24gcGFjZSwgd2l0aCBvbmUgdHJpYWwgcHJlc2VudGVkIG9uIGVhY2ggcGFnZSBhbmQgbm8gYWJpbGl0eSB0byBnbyBiYWNrd2FyZHMsIGFuZCBjaGlsZHJlbiBjb21wbGV0ZWQgdGhlIHN0dWR5IG9uIGFuIGV4cGVyaW1lbnRlcidzIGxhcHRvcCBjb21wdXRlci4gRm9sbG93aW5nIFN0dWR5IDEsIGZvciBvbGRlciBjaGlsZHJlbiB0aGUgZXhwZXJpbWVudGVyIHJlYWQgdGhlIGluc3RydWN0aW9ucyBhbmQgdGhlIGZpcnN0IHNldmVyYWwgdHJpYWxzIG91dCBsb3VkLCByZXF1ZXN0aW5nIHZlcmJhbCByZXNwb25zZXMgZnJvbSB0aGUgY2hpbGQgYW5kIHNlbGVjdGVkIGhpcyBvciBoZXIgcmVzcG9uc2UgZm9yIGhlcjsgYWZ0ZXIgc2V2ZXJhbCB0cmlhbHMsIHRoZSBleHBlcmltZW50ZXIgZ2F2ZSB0aGUgY2hpbGQgdGhlIG9wdGlvbiB0byBjb250aW51ZSBpbmRlcGVuZGVudGx5IGlmIHRoZXkgZGVzaXJlZC4gQWxsIHlvdW5nZXIgY2hpbGRyZW4gaGVhcmQgYWxsIHF1ZXN0aW9ucyByZWFkIGFsb3VkIGJ5IHRoZSBleHBlcmltZW50ZXIgYW5kIHJlc3BvbmRlZCB2ZXJiYWxseS4gCgpUaGUgMjAgbWVudGFsIGNhcGFjaXRpZXMgd2VyZSBhIHN1YnNldCBvZiB0aGUgNDAgaXRlbXMgdXNlZCBpbiBTdHVkeSAxLCBjaG9zZW4gdG8gaW5jbHVkZSBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMsIGVtb3Rpb25hbCBleHBlcmllbmNlcywgcGVyY2VwdHVhbCBhYmlsaXRpZXMsIGNvZ25pdGl2ZSBza2lsbHMsIGNhcGFjaXRpZXMgcmVsYXRlZCB0byBhdXRvbm9teSBvciBhZ2VuY3ksIGFuZCBzb2NpYWwgYWJpbGl0aWVzOyBhbmQgdG8gaW5jbHVkZSBzb21lIG9mIHRoZSBzdHJvbmdlc3QtbG9hZGluZyBpdGVtcyBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgZmFjdG9ycyB1bmNvdmVyZWQgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDEgKHNlZSBGaWd1cmUgMSkuIEFzIGluIFN0dWR5IDEsIGVhY2ggbWVudGFsIGNhcGFjaXR5IHdhcyBhc3NvY2lhdGVkIHdpdGggYSBzaG9ydCwgcHJlc2V0IGRlZmluaXRpb24uIEJvdGggb2xkZXIgYW5kIHlvdW5nZXIgY2hpbGRyZW4gd2VyZSBlbmNvdXJhZ2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0dWR5IHRvIGFzayBxdWVzdGlvbnMgaWYgdGhleSBkaWQgbm90IGtub3cgd2hhdCBhIHdvcmQgbWVhbnQsIGluIHdoaWNoIGNhc2UgdGhleSB3ZXJlIGdpdmVuIHRoZXNlIGRlZmluaXRpb25zLiAoQWR1bHRzIGRpZCBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlc2UgZGVmaW5pdGlvbnMuKQoKQWZ0ZXIgYXNraW5nIHRoZSAyMCBxdWVzaXRvbnMgYWJvdXQgbWVudGFsIGNhcGFjaXRpZXMsIGZvciBhIHN1YnNldCBvZiBwYXJ0aWNpcGFudHMgd2UgYWxzbyBhc2tlZCB0d28gYWRkaXRpb25hbCBxdWVzdGlvbnM6ICJJcyBhIFt0YXJnZXRdIG1hZGUgb3V0IG9mIG1ldGFsPyIgYW5kICJDYW4gYSBbdGFyZ2V0XSBiZSB0dXJuZWQgb24gYW5kIG9mZj8iIFNlZSBTT00gZm9yIGFuIGFuYWx5c2lzIG9mIHJlc3BvbnNlcyB0byB0aGVzZSBxdWVzdGlvbnMuCgojIyMgRGF0YSBwcm9jZXNzaW5nCgpXZSBwbGFubmVkIHRvIGRyb3AgdHJpYWxzIHdpdGggcmVzcG9uc2UgdGltZXMgdGhhdCB3ZXJlIGZhc3RlciB0aGFuIGEgcHJlc2V0IGNyaXRlcmlvbiBvZiAyNTBtcywgYnV0IHRoZXJlIHdlcmUgbm9uZSBhbW9uZyBjaGlsZHJlbiwgYW5kIHdlIGZhaWxlZCB0byByZWNvcmQgcmVzcG9uc2UgdGltZXMgYW1vbmcgYWR1bHRzLiBBcyBpbiBTdHVkeSAxLCB3ZSByZXRhaW5lZCBwYXJ0aWNpcGFudHMgcmVnYXJkbGVzcyBvZiBza2lwcGVkIHRyaWFscyAobj0wIHRyaWFscyBhbW9uZyBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCAzMCB0cmlhbHMgYW1vbmcgeW91bmdlciBjaGlsZHJlbikuIE92ZXJhbGwsIG5vbmUgb2YgYWR1bHRzIG9yIG9sZGVyIGNoaWxkcmVuJ3MgdHJpYWxzLCBhbmQgb25seSAxLjIxJSBvZiB5b3VuZ2VyIGNoaWxkcmVuJ3MgdHJpYWxzLCB3ZXJlIG1pc3NpbmcgZGF0YS4KCiMjIFJlc3VsdHMKCiMjIyBDb25jZXB0dWFsIHN0cnVjdHVyZTogQWR1bHRzCgpgYGB7cn0KIyBpbXBsZW1lbnQgMyBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29scwpuZmFjdF9wYXJfZDJfYWQgPC0gZmEucGFyYWxsZWwoZDJfYWRfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gY2hvc2VuX2ZtKSRuZmFjdApuZmFjdF9iaWNfZDJfYWQgPC0gdnNzKGQyX2FkX3dpZGVfaSwgY29yID0gY2hvc2VuX2Nvciwgcm90YXRlID0gY2hvc2VuX3JvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0pJHZzcy5zdGF0cyRCSUMgJT4lIHdoaWNoLm1pbigpCm5mYWN0X3dkbV9kMl9hZCA8LSByZXRlbl9mdW4oZDJfYWRfd2lkZV9pLCByb3RfdHlwZSA9IGNob3Nlbl9yb3QpCgpjYXQoIlBhcmFsbGVsIGFuYWx5c2lzOiAiLCBuZmFjdF9wYXJfZDJfYWQsCiAgICAiXG5NaW5pbWl6aW5nIEJJQzogIiwgbmZhY3RfYmljX2QyX2FkLAogICAgIlxuV2Vpc21hbiBldCBhbC46ICIsIG5mYWN0X3dkbV9kMl9hZCkKYGBgCgpBcyBpbiBTdHVkeSAxLCB0d28gb3Igb3VyIHRocmVlIG1ldGhvZHMgZm9yIGRldGVybWluaW5nIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluIChpbiB0aGlzIGNhc2UsIHBhcmFsbGVsIGFuYWx5c2lzIGFuZCBXZWlzbWFuIGV0IGFsLidzIGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEpIHN1Z2dlc3RlZCByZXRhaW5pbmcgdGhyZWUgZmFjdG9ycy4gKE1pbmltaXppbmcgQklDIHN1Z2dlc3RlZCByZXRhaW5pbmcgZm91ciBmYWN0b3JzOyBzZWUgU09NLikKCmBgYHtyfQplZmFfM19kMl9hZCA8LSBmYV9mdW4oZDJfYWRfd2lkZV9pLCAzKQplZmFfM19wbG90X2QyX2FkIDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QyX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZTAoIkFkdWx0cyAobj0iLCBucm93KGQyX2FkX3dpZGVfaSksICIpIikpICsKICBndWlkZXMoZmlsbCA9ICJub25lIikKYGBgCgpBcyBleHBlY3RlZCwgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIHJldmVhbGVkIGJ5IHRoaXMgYW5hbHlzaXMgYW1vbmcgYWR1bHRzIHdhcyBjaGFyYWN0ZXJpemVkIGJ5IGEgdGhyZWUtd2F5IGRpc3RpbmN0aW9uIGJldHdlZW4gX0JPRFlfIChmaXJzdCBmYWN0b3IsIGByIHJvdW5kKGVmYV8zX2QyX2FkJFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYxIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24pLCBfSEVBUlRfIChmaXJzdCBmYWN0b3IsIGByIHJvdW5kKGVmYV8zX2QyX2FkJFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2Ygc2hhcmVkIHZhcmlhbmNlKSwgYW5kIF9NSU5EXyAoZmlyc3QgZmFjdG9yLCBgciByb3VuZChlZmFfM19kMl9hZCRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMyJdLCAyKSAqIDEwMGAlIG9mIHNoYXJlZCB2YXJpYW5jZSkuIChTZWUgRmlndXJlIDQsIFBhbmVsIEQuKQoKVGhpcyBzdWdnZXN0cyB0aGF0IG91ciBtb2RpZmllZCBjaGlsZC1mcmllbmRseSBwYXJhZGlnbSB3YXMgdmFsaWQ6IFVzaW5nIGEgc2hvcnRlciBsaXN0IG9mIGl0ZW1zIGFuZCBhIHdpZGVyIHJhbmdlIG9mIHRhcmdldCBjaGFyYWN0ZXJzIGVsaWNpdGVkIHRoZSBzYW1lIGludHVpdGl2ZSBvbnRvbG9neSBvZiBtZW50YWwgbGlmZSwgYW1vbmcgVVMgYWR1bHRzLCB0aGF0IHdhcyByZXZlYWxlZCBpbiBTdHVkeSAxIGFuZCBpbiBXZWlzbWFuIGV0IGFsLidzIHByZXZpb3VzIHdvcmsuIAoKIyMjIENvbmNlcHR1YWwgc3RydWN0dXJlOiBPbGRlciBjaGlsZHJlbiAoNy05eSkKCmBgYHtyfQojIGltcGxlbWVudCAzIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzCm5mYWN0X3Bhcl9kMl83OSA8LSBmYS5wYXJhbGxlbChkMl83OV93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0pJG5mYWN0Cm5mYWN0X2JpY19kMl83OSA8LSB2c3MoZDJfNzlfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCByb3RhdGUgPSBjaG9zZW5fcm90LCAKICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSkkdnNzLnN0YXRzJEJJQyAlPiUgd2hpY2gubWluKCkKbmZhY3Rfd2RtX2QyXzc5IDwtIHJldGVuX2Z1bihkMl83OV93aWRlX2ksIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKCmNhdCgiUGFyYWxsZWwgYW5hbHlzaXM6ICIsIG5mYWN0X3Bhcl9kMl83OSwKICAgICJcbk1pbmltaXppbmcgQklDOiAiLCBuZmFjdF9iaWNfZDJfNzksCiAgICAiXG5XZWlzbWFuIGV0IGFsLjogIiwgbmZhY3Rfd2RtX2QyXzc5KQpgYGAKCk91ciB0aHJlZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbiBhbGwgc3VnZ2VzdGVkIHJldGFpbmluZyB0aHJlZSBmYWN0b3JzLgoKYGBge3J9CmVmYV8zX2QyXzc5IDwtIGZhX2Z1bihkMl83OV93aWRlX2ksIDMpCgplZmFfM19wbG90X2QyXzc5IDwtIGhlYXRtYXBfZnVuKGVmYV8zX2QyXzc5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZIiwgIkhFQVJUIiwgIk1JTkQiKSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZTAoIk9sZGVyIGNoaWxkcmVuICg3LTl5LCBuPSIsIG5yb3coZDJfNzlfd2lkZV9pKSwgIikiKSkgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpjb25nX2VmYV8zX2QyX2FkXzc5IDwtIGZhLmNvbmdydWVuY2UoZWZhXzNfZDJfNzkkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19kMl9hZCRsb2FkaW5ncykKYGBgCgpBcyBpbiBTdHVkeSAxLCB0aGUgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgcmV2ZWFsZWQgYnkgdGhpcyBhbmFseXNpcyBhbW9uZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIHdhcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiBhZHVsdHMsIGFnYWluIGNoYXJhY3Rlcml6ZWQgYnkgYSB0aHJlZS13YXkgZGlzdGluY3Rpb24gYmV0d2VlbiBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8uCgpBZnRlciByb3RhdGlvbiwgdGhlIGZpcnN0IGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgY29uZmlybWVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9CT0RZXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMSIsICJGMSJdYDsgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMSIsICJGMiJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNzlbIkYxIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QyXzc5LCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMl83OSRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSBzZWNvbmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfSEVBUlRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMiIsICJGMiJdYDsgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDJfYWRfNzlbIkYyIiwgIkYxIl1gOyB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kMl9hZF83OVsiRjIiLCAiRjMiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfNzksIDQsICJGMiIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QyXzc5JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHRoaXJkIGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgY29uZmlybWVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9NSU5EXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMyIsICJGMyJdYDsgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QyX2FkXzc5WyJGMyIsICJGMiJdYDsgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDJfYWRfNzlbIkYzIiwgIkYxIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QyXzc5LCA0LCAiRjMiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMl83OSRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMyJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAoU2VlIEZpZ3VyZSA0LCBQYW5lbCBDLCBmb3IgYWxsIGZhY3RvciBsb2FkaW5ncy4pCgpXZSBjb25zaWRlciB0aGlzIHRvIGJlIGEgY2xvc2UgY29uY2VwdHVhbCByZXBsaWNhdGlvbiBvZiBvdXIgU3R1ZHkgMSBmaW5kaW5ncywgc3VnZ2VzdGluZyB0aGF0IGJ5IHRoZSBhZ2Ugb2YgNy05IHllYXJzLCB0aGlzIHRocmVlLXBhcnQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgaXMgc3RhYmxlIGFuZCByb2J1c3QgdG8gYSByYW5nZSBvZiBleHBlcmltZW50YWwgY29uZGl0aW9ucy4KCiMjIyBDb25jZXB0dWFsIHN0cnVjdHVyZTogWW91bmdlciBjaGlsZHJlbiAoNC02eSkKCmBgYHtyfQojIGltcGxlbWVudCAzIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzCm5mYWN0X3Bhcl9kMl80NiA8LSBmYS5wYXJhbGxlbChkMl80Nl93aWRlX2ksIGNvciA9IGNob3Nlbl9jb3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBjaG9zZW5fZm0pJG5mYWN0Cm5mYWN0X2JpY19kMl80NiA8LSB2c3MoZDJfNDZfd2lkZV9pLCBjb3IgPSBjaG9zZW5fY29yLCByb3RhdGUgPSBjaG9zZW5fcm90LCAKICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGNob3Nlbl9mbSkkdnNzLnN0YXRzJEJJQyAlPiUgd2hpY2gubWluKCkKbmZhY3Rfd2RtX2QyXzQ2IDwtIHJldGVuX2Z1bihkMl80Nl93aWRlX2ksIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKCmNhdCgiUGFyYWxsZWwgYW5hbHlzaXM6ICIsIG5mYWN0X3Bhcl9kMl80NiwKICAgICJcbk1pbmltaXppbmcgQklDOiAiLCBuZmFjdF9iaWNfZDJfNDYsCiAgICAiXG5XZWlzbWFuIGV0IGFsLjogIiwgbmZhY3Rfd2RtX2QyXzQ2KQpgYGAKCk91ciB0aHJlZSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBob3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbiBlYWNoIHN1Z2dlc3RlZCByZXRhaW5pbmcgZGlmZmVyZW50IG51bWJlcnMgb2YgZmFjdG9yczogV2Vpc21hbiBldCBhbC4ncyBmYWN0b3IgcmV0ZW50aW9uIGNyaXRlcmlhIHN1Z2dlc3RlZCByZXRhaW5pbmcgdGhyZWUgZmFjdG9ycywgcGFyYWxsZWwgYW5hbHlzaXMgc3VnZ2VzdGVkIHJldGFpbmluZyB0d28gZmFjdG9ycywgYW5kIG1pbmltaXppbmcgQklDIHN1Z2dlc3RlZCBhIG51bGwsIG9uZS1mYWN0b3Igc29sdXRpb24uIEhlcmUgd2UgcHJlc2VudCBib3RoIHRoZSB0d28tIGFuZCB0aHJlZS1mYWN0b3Igc29sdXRpb25zLiAoU2VlIFNPTSBmb3IgZmFjdG9yIGxvYWRpbmdzIG9uIHRoZSBvbmUgImZhY3RvciIgaW4gdGhlIG51bGwsIG9uZS1mYWN0b3Igc29sdXRpb24uKQoKIyMjIyBUaHJlZS1mYWN0b3Igc29sdXRpb24KCmBgYHtyfQplZmFfM19kMl80NiA8LSBmYV9mdW4oZDJfNDZfd2lkZV9pLCAzKQoKZWZhXzNfcGxvdF9kMl80NiA8LSBoZWF0bWFwX2Z1bihlZmFfM19kMl80NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RZKiIsICJNSU5EIiwgIkhFQVJUKiIpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiWW91bmVyIGNoaWxkcmVuICg0LTZ5LCBuPSIsIG5yb3coZDJfNzlfd2lkZV9pKSwgIik6IDMtZmFjdG9yIHNvbHV0aW9uIikpICsKICBndWlkZXMoZmlsbCA9ICJub25lIikKYGBgCgpgYGB7cn0KY29uZ19lZmFfM19kMl9hZF80NiA8LSBmYS5jb25ncnVlbmNlKGVmYV8zX2QyXzQ2JGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhXzNfZDJfYWQkbG9hZGluZ3MpCmBgYAoKSW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBXZWlzbWFuIGV0IGFsLidzIHJldGVudGlvbiBjcml0ZXJpYSwgdGhlIGZpcnN0IGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucywgYXMgd2VsbCBhcyBzb21lIHBvc2l0aXZlIGVtb3Rpb25zLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBpbmRpY2F0ZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0JPRFlfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYxIiwgIkYxIl1gKSwgYnV0IHdhcyBhbHNvIHF1aXRlIHNpbWlsYXIgdG8gYWR1bHRzJyBfSEVBUlRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfSEVBUlRfOiBgciBjb25nX2VmYV8zX2QyX2FkXzQ2WyJGMSIsICJGMiJdYDsgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYxIiwgIkYzIl1gKS4gSXQgd2FzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIHN1Y2ggaXRlbXMgYXMgYHIgdG9wX25fZG9tQ2FwKGVmYV8zX2QyXzQ2LCA0LCAiRjEiLCAicG9zIilgLCBhbmQgYWNjb3VudGVkIGZvciBgciByb3VuZChlZmFfM19kMl80NiRWYWNjb3VudGVkWyJQcm9wb3J0aW9uIEV4cGxhaW5lZCIsICJGMSJdLCAyKSAqIDEwMGAlIG9mIHRoZSBzaGFyZWQgdmFyaWFuY2UgaW4gdGhlIHJvdGF0ZWQgdGhyZWUtZmFjdG9yIHNvbHV0aW9uLiAKClRoZSBzZWNvbmQgZmFjdG9yIGNvcnJlc3BvbmRlZCBwcmltYXJpbHkgdG8gcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzLCBhcyB3ZWxsIGFzIG9uZSBjb21wbGV4IG5lZ2F0aXZlIGVtb3Rpb24gKF9mZWVsIGd1aWx0eV8pLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBjb25maXJtZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX01JTkRfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfTUlORF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYyIiwgIkYzIl1gOyB3aXRoIF9IRUFSVF86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYyIiwgIkYyIl1gOyB3aXRoIF9CT0RZXzogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjIiLCAiRjEiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfNDYsIDQsICJGMiIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QyXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYyIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHRoaXJkIGZhY3RvciBjb3JyZXNwb25kZWQgcHJpbWFyaWx5IHRvIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzLCB3aXRoIHBhcnRpY3VsYXJseSBzdHJvbmcgbG9hZGluZ3MgZm9yIHBvc2l0aXZlIGVtb3Rpb25zLiBBbiBhbmFseXNpcyBvZiBmYWN0b3IgY29uZ3J1ZW5jZSBpbmRpY2F0ZWQgdGhhdCB0aGlzIGZhY3RvciB3YXMgbW9zdCBzaW1pbGFyIHRvIGFkdWx0cycgX0hFQVJUXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjMiLCAiRjIiXWApLCBidXQgYWxzbyBxdWl0ZSBzaW1pbGFyIHRvIGFkdWx0cycgX0JPRFlfIGZhY3RvciAoY29zaW5lIHNpbWlsYXJpdHkgd2l0aCBfQk9EWV86IGByIGNvbmdfZWZhXzNfZDJfYWRfNDZbIkYzIiwgIkYxIl1gOyB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfM19kMl9hZF80NlsiRjMiLCAiRjMiXWApLiBJdCB3YXMgdGhlIGRvbWluYW50IGZhY3RvciBmb3Igc3VjaCBpdGVtcyBhcyBgciB0b3Bfbl9kb21DYXAoZWZhXzNfZDJfNDYsIDQsICJGMyIsICJwb3MiKWAsIGFuZCBhY2NvdW50ZWQgZm9yIGByIHJvdW5kKGVmYV8zX2QyXzQ2JFZhY2NvdW50ZWRbIlByb3BvcnRpb24gRXhwbGFpbmVkIiwgIkYzIl0sIDIpICogMTAwYCUgb2YgdGhlIHNoYXJlZCB2YXJpYW5jZSBpbiB0aGUgcm90YXRlZCB0aHJlZS1mYWN0b3Igc29sdXRpb24uIChTZWUgRmlndXJlIDQsIFBhbmVsIEIsIGZvciBhbGwgZmFjdG9yIGxvYWRpbmdzLikKCiMjIyMgVHdvLWZhY3RvciBzb2x1dGlvbgoKYGBge3J9CmVmYV8yX2QyXzQ2IDwtIGZhX2Z1bihkMl80Nl93aWRlX2ksIDIpCgplZmFfMl9wbG90X2QyXzQ2IDwtIGhlYXRtYXBfZnVuKGVmYV8yX2QyXzQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGMoIkJPRFktSEVBUlQiLCAiTUlORCIpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlMCgiWW91bmVyIGNoaWxkcmVuICg0LTZ5LCBuPSIsIG5yb3coZDJfNzlfd2lkZV9pKSwgIik6IDItZmFjdG9yIHNvbHV0aW9uIikpCmBgYAoKYGBge3J9CmNvbmdfZWZhXzJfZDJfYWRfNDYgPC0gZmEuY29uZ3J1ZW5jZShlZmFfMl9kMl80NiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV8zX2QyX2FkJGxvYWRpbmdzKQpgYGAKCkluIHRoZSByb3RhdGVkIHR3by1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IHBhcmFsbGVsIGFuYWx5c2lzLCB0aGUgZmlyc3QgZmFjdG9yIGVuY29tcGFzc2VkIGJvdGggcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIGFuZCBlbW90aW9ucy4gQW4gYW5hbHlzaXMgb2YgZmFjdG9yIGNvbmdydWVuY2UgaW5kaWNhdGVkIHRoYXQgdGhpcyBmYWN0b3Igd2FzIG1vc3Qgc2ltaWxhciB0byBhZHVsdHMnIF9CT0RZXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMSIsICJGMSJdYCksIGJ1dCB3YXMgYWxzbyBxdWl0ZSBzaW1pbGFyIHRvIGFkdWx0cycgX0hFQVJUXyBmYWN0b3IgKGNvc2luZSBzaW1pbGFyaXR5IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjEiLCAiRjIiXWA7IHdpdGggX01JTkRfOiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMSIsICJGMyJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfMl9kMl80NiwgNCwgIkYxIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzJfZDJfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjEiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHR3by1mYWN0b3Igc29sdXRpb24uIAoKVGhlIHNlY29uZCBmYWN0b3IgY29ycmVzcG9uZGVkIHByaW1hcmlseSB0byBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMuIEFuIGFuYWx5c2lzIG9mIGZhY3RvciBjb25ncnVlbmNlIGNvbmZpcm1lZCB0aGF0IHRoaXMgZmFjdG9yIHdhcyBtb3N0IHNpbWlsYXIgdG8gYWR1bHRzJyBfTUlORF8gZmFjdG9yIChjb3NpbmUgc2ltaWxhcml0eSB3aXRoIF9NSU5EXzogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjIiLCAiRjMiXWA7IHdpdGggX0hFQVJUXzogYHIgY29uZ19lZmFfMl9kMl9hZF80NlsiRjIiLCAiRjEiXWA7IHdpdGggX0JPRFlfOiBgciBjb25nX2VmYV8yX2QyX2FkXzQ2WyJGMiIsICJGMSJdYCkuIEl0IHdhcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBzdWNoIGl0ZW1zIGFzIGByIHRvcF9uX2RvbUNhcChlZmFfMl9kMl80NiwgNCwgIkYyIiwgInBvcyIpYCwgYW5kIGFjY291bnRlZCBmb3IgYHIgcm91bmQoZWZhXzJfZDJfNDYkVmFjY291bnRlZFsiUHJvcG9ydGlvbiBFeHBsYWluZWQiLCAiRjIiXSwgMikgKiAxMDBgJSBvZiB0aGUgc2hhcmVkIHZhcmlhbmNlIGluIHRoZSByb3RhdGVkIHRocmVlLWZhY3RvciBzb2x1dGlvbi4gKFNlZSBGaWd1cmUgNCwgUGFuZWwgQSwgZm9yIGFsbCBmYWN0b3IgbG9hZGluZ3MuKQoKCioqQk9PS01BUksqKgoKCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAxfQpmaWcwNF9wbG90cyA8LSBwbG90X2dyaWQoZWZhXzJfcGxvdF9kMl80NiwgZWZhXzNfcGxvdF9kMl80NiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfM19wbG90X2QyXzc5LCBlZmFfM19wbG90X2QyX2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIpKQpmaWcwNF93aXRoX2NhcHRpb24gPC0gYWRkX3N1YihmaWcwNF9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA0OiBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgcmVzdWx0cyBmb3IgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiAoQS1CKSwgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiAoQikgYW5kIGFkdWx0cyAoQykgaW4gU3R1ZHkgMiwgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBhc3Nlc3NlZCAyMCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIG5pbmUgdGFyZ2V0IGVudGl0aWVzOiBhIGNvbXB1dGVyLCBhIHJvYm90LCBhIGJlZXRsZSwgYSBiaXJkLCBhIG1vdXNlLCBhIGdvYXQsIG9yIGFuIGVsZXBoYW50LiBGb3IgeW91bmdlciBjaGlsZHJlbiwgd2UgaW5jbHVkZSBib3RoIHRoZSB0d28tZmFjdG9yIHNvbHV0aW9uIHN1Z2dlc3RlZCBieSBwYXJhbGxlbCBhbmFseXNpcyAoQSkgYW5kIHRoZSB0aHJlZS1mYWN0b3Igc29sdXRpb24gc3VnZ2VzdGVkIGJ5IFdlaXNtYW4gZXQgYWwuJ3MgKDIwMTcpIGZhY3RvciByZXRlbnRpb24gY3JpdGVyaWEgKEIpLiIsIDE0MyksIHggPSAwLCBoanVzdCA9IDApCmdnZHJhdyhmaWcwNF93aXRoX2NhcHRpb24pCmBgYAoKCioqQk9PS01BUksqKgoKCiMjIERpc2N1c3Npb24KClhYCgojIFN0dWR5IDMKClRoZSBwcmltYXJ5IGdvYWwgb2YgU3R1ZHkgMyB3YXMgdG8gKGNvbmNlcHR1YWxseSkgcmVwbGljYXRlIGFuZCBleHRlbmQgb3VyIGZpbmRpbmdzIHdpdGggNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbiBpbiBTdHVkeSAyLiBJbiBsaWdodCBvZiB0aGUgY29uY2VybnMgYWJvdXQgdm9jYWJ1bGFyeSwgYXR0ZW50aW9uLCBhbmQgdXNlIG9mIHRoZSByZXNwb25zZSBzY2FsZSBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuIGluIFN0dWR5IDIsIHdlIGRlc2lnbmVkIGFuIGV2ZW4gbW9yZSBjaGlsZC1mcmllbmRseSB2ZXJzaW9uIHdlbGwgc3VpdGVkIGZvciB5b3VuZyBwcmVzY2hvb2xlcnMsIHN0cmVhbWxpbmluZyB0aGUgZXhwZXJpbWVudGFsIHByb3RvY29sLCBwcm92aWRpbmcgbW9yZSBzY2FmZm9sZGluZyBmb3IgdGhlIHJlc3BvbnNlIHNjYWxlLCBhbmQgaW5jbHVkaW5nIG9ubHkgdm9jYWJ1bGFyeSBpdGVtcyB0aGF0IHdlcmUgcHJlLXRlc3RlZCB0byBiZSBmYW1pbGlhciB0byB5b3VuZyBwcmVzY2hvb2wgY2hpbGRyZW4gKHNlZSAiTWV0aG9kIikuIAoKQSBzZWNvbmQgZ29hbCBvZiBTdHVkeSAzIHdhcyB0byBhc3Nlc3MgeW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBtZW50YWwgbGlmZSB0byBlZGdlIGNhc2VzLiBSZWNhbGwgdGhhdCwgaW4gU3R1ZHkgMSwgb2xkZXIgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzICgiaGVhcnQiKSB0byBib3RoIGJlZXRsZXMgYW5kIHJvYm90cyB0aGFuIGRpZCBhZHVsdHMsIGRlc3BpdGUgc2hhcmluZyBhZHVsdHMnIHRocmVlLXBhcnQgY29uY2VwdHVhbCBzdHJ1Y3R1cmU7IHRoaXMgImVkZ2UgY2FzZSIgYXBwcm9hY2ggb2YgU3R1ZHkgMSBhbGxvd2VkIHVzIHRvIGVzdGltYXRlIG9sZGVyIGNoaWxkcmVuJ3MgYWdncmVnYXRlIGF0dHJpYnV0aW9ucyB0byB0aGVzZSBlbnRpdGllcyB3aXRoIHByZWNpc2lvbiBhbmQgdG8gY2hhcnQgY2hhbmdlcyBpbiB0aGVzZSBhdHRyaWJ1dGlvbnMgb3ZlciBhZ2UgY29udGludW91c2x5IHdpdGhpbiB0aGUgcmFuZ2Ugb2YgNy05IHllYXJzLCBiZWNhdXNlIGxhcmdlIG51bWJlcnMgb2YgY2hpbGRyZW4gYXNzZXNzZWQgZWFjaCBvZiB0aGUgdHdvIHRhcmdldCBlbnRpdGllcyAocmF0aGVyIHRoYW4gcGFydGljaXBhbnRzIGJlaW5nIGRpc3RyaWJ1dGVkIGFjcm9zcyBhIHdpZGVyIHJhbmdlIG9mIHRhcmdldCBlbnRpdGllcykuIEluIFN0dWR5IDMsIHdlIHJldHVybmVkIHRvIHRoaXMgYXBwcm9hY2gsIGxpbWl0aW5nIHRoZSB0YXJnZXQgY2hhcmFjdGVycyB0byBhIGJlZXRsZSBhbmQgYSByb2JvdCwgc28gYXMgdG8gZm9sbG93IHVwIG9uIHRoaXMgc2Vjb25kYXJ5IGZpbmRpbmcgd2l0aCBhIHlvdW5nZXIgZ3JvdXAgb2YgY2hpbGRyZW4uIAoKRmluYWxseSwgU3R1ZHkgMyB3YXMgZGVzaWduZWQgaW4gYW50aWNpcGF0aW9uIG9mIGRldmVsb3BpbmcgcGFydGljaXBhbnQtbGV2ZWwgYW5hbHlzZXMgdG8gc3VwcGxlbWVudCB0aGUgZ3JvdXAtbGV2ZWwgRUZBcyBkaXNjdXNzZWQgc28gZmFyIChzZWUgIkNvbnRpbnVvdXMgZGV2ZWxvcG1lbnQgYXQgdGhlIHBhcnRpY2lwYW50IGxldmVsOiBBIHJlLWFuYWx5c2lzIG9mIFN0dWRpZXMgMS0zLCIgYmVsb3cpLiBXaXRoIHRoaXMgZ2VuZXJhbCBnb2FsIGluIG1pbmQsIHdlIGFza2VkIGVhY2ggY2hpbGQgdG8gYXNzZXNzIHRoZSBtZW50YWwgY2FwYWNpdGllcyBvZiBib3RoIGEgYmVldGxlIGFuZCBhIHJvYm90LCBzbyBhcyB0byBtYXhpbWl6ZSB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBwZXIgcGFydGljaXBhbnQgZm9yIHRoZXNlIGFudGljaXBhdGVkIHBhcnRpY2lwYW50LWxldmVsIGFuYWx5c2VzLgoKIyMgTWV0aG9kCgojIyMgUGFydGljaXBhbnRzCgpYWCBwZW9wbGUgcGFydGljaXBhdGVkIGluIHRoaXMgc3R1ZHkuCgpBZHVsdHMgKG49WFgpIHBhcnRpY2lwYXRlZCB2aWEgQW1hem9uIE1lY2hhbmljYWwgVHVyayAoTVR1cmspIGluIFNlcHRlbWJlciAyMDE4LiBBZHVsdCBwYXJ0aWNpcGFudHMgaGFkIGdhaW5lZCBhcHByb3ZhbCBmb3IgYXQgbGVhc3QgOTUlIG9mIHRoZWlyIHByZXZpb3VzIHdvcmsgb24gTVR1cms7IGhhZCBNVHVyayBhY2NvdW50cyBiYXNlZCBpbiB0aGUgVVM7IGFuZCBpbmRpY2F0ZWQgdGhhdCB0aGV5IHdlcmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkLiBBZHVsdHMgd2VyZSBwYWlkICQwLjc1IGZvciBhcHByb3hpbWF0ZWx5IFhYIG1pbnV0ZXMgb2YgdGhlaXIgdGltZSAobWVkaWFuIGR1cmF0aW9uOiBYWCBtaW4pLiBBbiBhZGRpdGlvbmFsIFhYIGFkdWx0cyBwYXJ0aWNpcGF0ZWQgYnV0IHdlcmUgZXhjbHVkZWQgZm9yIGZhaWxpbmcgdG8gcGFzcyBvbmUgb3IgbW9yZSBhdHRlbnRpb24gY2hlY2tzIChlLmcuLCAiUGxlYXNlIHNlbGVjdCBubyI7IG49WFgpIG9yIGZvciBmYWlsaW5nIHRvIHJlc3BvbmQgc2Vuc2libHkgdG8gYW4gb3Blbi1lbmRlZCBxdWVzdGlvbiBhYm91dCB3aGF0IHRoZXkgaGFkIGJlZW4gYXNrZWQgdG8gZG8gaW4gdGhlIHN0dWR5IChzZWUgU3R1ZHkgMyBmb3IgZXhhbXBsZXM7IG49WFgpLgoKQW1vbmcgdGhlIGZpbmFsIHNhbXBsZSBvZiBYWCBhZHVsdHMsIFhYJSBpZGVudGlmaWVkIGFzIHdvbWVuIGFuZCBYWCUgYXMgbWVuLiBBZHVsdHMgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIGFzIFdoaXRlIChYWCU7IFhYJSBhcyBCbGFjaywgWFglIGFzIEFzaWFuOyBYWCUgYXMgWFgpLCBhbmQgcmVwb3J0ZWQgYmVpbmcgYmV0d2VlbiBYWCBhbmQgWFggeWVhcnMgb2YgYWdlIChtZWRpYW4gYWdlOiBYWCB5ZWFycykuIFhYIE9USEVSIERFTU9HUkFQSElDUzogTmF0aXZlIGxhbmd1YWdlLCBlZHVjYXRpb24sIHJlbGlnaW9uIGFzIGEgY2hpbGQsIHJlbGlnaW9uIG5vdywgam9iLgpYWCBjaGlsZHJlbiBwYXJ0aWNpcGF0ZWQgaW4gdGhpcyBzdHVkeSwgd2hpY2ggd2FzIGNvbmR1Y3RlZCBiZXR3ZWVuIEphbnVhcnkgMjAxOCBhbmQgWFggMjAxOC4gT3VyIHBsYW5uZWQgc2FtcGxlIHNpemUgd2FzIDEwMCBjaGlsZHJlbiwgYnV0IHdlIGFsc28gcmV0YWluZWQgYSBoYW5kZnVsIG9mIGV4dHJhIHBhcnRpY2lwYW50cyB3aG8gY29tcGxldGVkIHRoZSBzdHVkeSBvbiB0aGUgZmluYWwgZGF5cyBvZiBkYXRhIGNvbGxlY3Rpb24uIENoaWxkcmVuIHJhbmdlZCBpbiBhZ2UgZnJvbSA0LjAwLVhYeSAobWVkaWFuOiBYWHkpLCBhbmQgcGFydGljaXBhdGVkIGF0IHRoZWlyIHByZXNjaG9vbDsgZXhhY3QgZHVyYXRpb24gd2FzIG5vdCByZWNvcmRlZCwgYnV0IHRoZSBmdWxsIHN0dWR5IHNlc3Npb24gZ2VuZXJhbGx5IHRvb2sgbGVzcyB0aGFuIDEwIG1pbnV0ZXMuIEFjY29yZGluZyB0byBzY2hvb2wgcmVjb3JkcywgWFggY2hpbGRyZW4gKFhYJSkgd2VyZSBnaXJscyBhbmQgWFggKFhYJSkgd2VyZSBib3lzOyBmb3IgWFggY2hpbGRyZW4gKFhYKSBnZW5kZXIgd2FzIGVpdGhlciBub24tYmluYXJ5IG9yIHVua25vd24uIFBhcmVudHMgcHJlZG9taW5hbnRseSBpZGVudGlmaWVkIHRoZWlyIGNoaWxkcmVuIGFzIFdoaXRlIChYWCUpIG9yIEFzaWFuIChYWCU7IFhYJSBhcyBCbGFjaywgWFglIGFzIEFzaWFuOyBYWCUgYXMgWFgpLiBYWCBPVEhFUiBERU1PR1JBUEhJQ1MuCgpBbiBhZGRpdGlvbmFsIFhYIGNoaWxkcmVuIHBhcnRpY2lwYXRlZCBidXQgd2VyZSBleGNsdWRlZCBmb3IgYmVpbmcgb3V0c2lkZSB0aGUgdGFyZ2V0IGFnZSByYW5nZS4gCgojIyMgTWF0ZXJpYWxzIGFuZCBwcm9jZWR1cmUgCgpNYXRlcmlhbHMgYW5kIHByb2NlZHVyZSB3ZXJlIGFkYXB0ZWQgdG8gYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgeW91bmcgcHJlc2Nob29sZXJzLCB3aXRoIHR3byBwcmltYXJ5IGdvYWxzIGluIG1pbmQ6IFN0cmVhbWxpbmluZyB0aGUgZXhwZXJpbWVudGFsIHByb3RvY29sIHRvIGltcHJvdmUgY2hpbGRyZW4ncyBjb21wcmVoZW5zaW9uIGFuZCBhdHRlbnRpb24gdG8gdGhlIHRhc2ssIGFuZCBsaW1pdGluZyBtZW50YWwgY2FwYWNpdGllcyB0byB3b3JkcyB0aGF0IGFyZSBoaWdobHkgZmFtaWxpYXIgdG8geW91bmcgcHJlc2Nob29sIGNoaWxkcmVuLgoKSW4gb3JkZXIgdG8gc3RyZWFtbGluZSB0aGUgZXhwZXJpbWVudGFsIHByb3RvY29sLCB3ZSBtb3ZlZCB0aGUgdGFzayBvZmYgb2YgdGhlIGNvbXB1dGVyIChmb3IgY2hpbGRyZW4gYnV0IG5vdCBhZHVsdHMpLCBpbnN0ZWFkIHVzaW5nIHByaW50ZWQgcGhvdG9ncmFwaHMgb2YgdGhlIHRhcmdldCBlbnRpdGllcyAobWVhc3VyaW5nIGFwcHJveGltYXRlbHkgNSB4IDggaW5jaGVzLCBwcmludGVkIGluIGNvbG9yIGFuZCBsYW1pbmF0ZWQpIGFuZCByZWNvcmRpbmcgY2hpbGRyZW4ncyByZXNwb25zZXMgYnkgaGFuZCAocmF0aGVyIHRoYW4gdXNpbmcgdGhlIGNvbXB1dGVyKS4gQXQgdGhlIHRpbWUgb2YgdGVzdGluZywgdGhlIGV4cGVyaW1lbnRlciBhbmQgY2hpbGQgc2F0IHNpZGUgYnkgc2lkZSwgd2l0aCB0aGUgcGhvdG9ncmFwaCBwbGFjZWQgZGlyZWN0bHkgaW4gZnJvbnQgb2YgdGhlIGNoaWxkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHRhc2suIAoKV2UgYWxzbyBzdHJlYW1saW5lZCB0aGUgaW50cm9kdWN0aW9uIHRvIHRoZSB0YXNrLiBUaGUgZXhwZXJpbWVudGVyIGJlZ2FuIGJ5IHBsYWNpbmcgdGhlIHBob3RvZ3JhcGggb2YgdGhlIGZpcnN0IHRhcmdldCBlbnRpdHkgaW4gZnJvbnQgb2YgdGhlIGNoaWxkIGFuZCBhc2tpbmcsICJDYW4geW91IHRlbGwgbWUgd2hhdCB0aGlzIGlzPyIgSWYgYSBjaGlsZCBwcm92aWRlZCBhbiBhbnN3ZXIgb3RoZXIgdGhhbiAiYmVldGxlIiBvciAicm9ib3QsIiB0aGUgZXhwZXJpbWVudGVyIHNhaWQsICJJJ20gZ29pbmcgdG8gY2FsbCBpdCBhIFtiZWV0bGUvcm9ib3RdLiIgVGhlbiB0aGUgZXhwZXJpbWVudGVyIHNhaWQsICJXZSdyZSBnb2luZyB0byBwbGF5IGEgZ2FtZSBhYm91dCBbYmVldGxlcy9yb2JvdHNdLCIgcmVtaW5kZWQgY2hpbGRyZW4sICJpZiB5b3UgZXZlciB3YW50IHRvIHN0b3AgcGxheWluZywgeW91IGNhbiBqdXN0IGxldCBtZSBrbm93IGFuZCB3ZSdsbCBnbyBiYWNrIHRvIHRoZSBjbGFzc3Jvb20iIChwZXIgcHJlc2Nob29sIHByb3RvY29sKSwgYW5kIHRoZW4gbGF1bmNoZWQgaW50byB0aGUgZmlyc3QgcXVlc3Rpb24gKGUuZy4sICJDYW4gYmVldGxlcyBnZXQgc2FkPyIpLgoKV2Ugc2NhZmZvbGRlZCBjaGlsZHJlbidzIHVzZSBvZiB0aGUgdGhyZWUtcG9pbnQgcmVzcG9uc2Ugc2NhbGUgYnkgcHJvdmlkaW5nIGEgcGh5c2ljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlLCBjb25zaXN0aW5nIG9mIHRocmVlIGxhcmdlIGJveGVzLCBzZXBhcmF0ZWQgYnkgYmxhbmsgc3BhY2UsIGNvbnRhaW5pbmcgdGhlIHdvcmRzIE5PLCBLSU5EQSwgYW5kIFlFUyB3cml0dGVuIGluIGxhcmdlIGZvbnQgd2l0aCBhbGwgY2FwaXRhbCBsZXR0ZXJzICh0byBhaWQgY2hpbGRyZW4gd2l0aCBhdCBsZWFzdCBzb21lIHJlYWRpbmcgc2tpbGxzIGluIHJlY29nbml6aW5nIHRoZXNlIHdvcmRzKTsgY29sb3ItY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBpbnRlbnNpdHkgb2YgcmVzcG9uc2UgKE5PID0gdmVyeSBsaWdodCBibHVlLCBLSU5EQSA9IG1lZGl1bSBibHVlLCBZRVMgPSBkYXJrIGJsdWUpOyBhbmQgb3JkZXJlZCBmcm9tIGxlZnQgKE5PKSB0byByaWdodCAoWUVTKS4gRWFjaCBib3ggbWVhc3VyZWQgYXBwcm94aW1hdGVseSAyIHggNCBpbmNoZXM7IHRoZSBib3hlcyB3ZXJlIGxhbWluYXRlZCB3aXRoIHNsaWdodGx5IGxlc3MgdGhhbiAxIGluY2ggb2YgZW1wdHkgc3BhY2UgYmV0d2VlbiB0aGVtICh0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSB3YXMgdmlzaWJsZSkuIEluIGFkZGl0aW9uIHRvIHByb3ZpZGluZyB0aGVzZSB2aXN1YWwgYW5kIHNwYXRpYWwgY3VlcyB0byB0aGUgZmFjdCB0aGF0IHRoZXJlIHdlcmUgdGhyZWUgcmVzcG9uc2Ugb3B0aW9uc+KAlG5vLCB5ZXMsIGFuZCBzb21ldGhpbmcgY29uY2VwdHVhbGx5IGFuZCBsaXRlcmFsbHkgImluIGJldHdlZW4iIHRoZXNlIGV4dHJlbWVz4oCUd2UgYWxzbyBhZGRlZCBhIGxpbmUgdG8gdGhlIGV4cGVyaW1lbnRlcidzIHNjcmlwdCBkZXNjcmliaW5nIChhbmQgdGhlbiByZWl0ZXJhdGluZykgdGhlc2UgcmVzcG9uc2Ugb3B0aW9ucyBvbiB0aGUgZmlyc3QgdGhyZWUgdHJpYWxzICgiWW91IGNhbiBzYXkgbm8gW3BvaW50aW5nIHRvIE5PXSwga2luZGEgW3BvaW50aW5nIHRvIEtJTkRBXSwgb3IgeWVzIFtwb2ludGluZyB0byBZRVNdIikuIFRoZSBleHBlcmltZW50ZXIgcmVwZWF0ZWQgdGhlc2Ugb3B0aW9ucyBvbiB0aGUgZmlyc3QgdGhyZWUgdHJpYWxzIGZvciBhbGwgY2hpbGRyZW4sIGFuZCBvbiBhbnkgb3RoZXIgdHJpYWxzIHdoZXJlIGEgY2hpbGQgdG9vayBtb3JlIHRoYW4gYSBmZXcgc2Vjb25kcyB0byBhbnN3ZXIgb3IgcHJvdmlkZWQgYSByZXNwb25zZSBvdGhlciB0aGFuIHNheWluZyAieWVzLCIgImtpbmRhLCIgb3IgIm5vIiBvciBjbGVhcmx5IHBvaW50aW5nIHRvIG9uZSBvZiB0aGVzZSBvcHRpb25zIG9uIHRoZSByZXNwb25zZSBzY2FsZS4KCkZvciBlYWNoIHRhcmdldCBlbnRpdHksIGNoaWxkcmVuIGFuc3dlcmVkIDE4IHF1ZXN0aW9ucyBhYm91dCBpdHMgbWVudGFsIGNhcGFjaXRpZXMuIFRoZXNlIHF1ZXN0aW9ucyB3ZXJlIGRlc2lnbmVkIHRvIGluY2x1ZGUgc2l4IGNsZWFyIGV4YW1wbGVzIG9mIGJvZGlseSwgc29jaWFsLWVtb3Rpb25hbCwgYW5kIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcywgYWNjb3JkaW5nIHRvIFN0dWRpZXMgMS0yIGFuZCBXZWlzbWFuIGV0IGFsLidzICgyMDE3KSBvcmlnaW5hbCBzdHVkaWVzIHdpdGggVVMgYWR1bHRzLiBCb2RpbHkgYWJpbGl0aWVzIGluY2x1ZGVkIGZlZWwgaHVuZ3J5LCBnZXQgdGhpcnN0eSwgZmVlbCBzaWNrLCBmZWVsIHRpcmVkLCBnZXQgc2NhcmVkLCBhbmQgc21lbGwgdGhpbmdzLiBTb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyBpbmNsdWRlZCBsb3ZlIHNvbWVvbmUsIGhhdGUgc29tZW9uZSwgZmVlbCBoYXBweSwgZ2V0IHNhZCwgZmVlbCBzb3JyeSwgZ2V0IGxvbmVseS4gUGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIGluY2x1ZGVkIHNlZSwgaGVhciwgdGhpbmssIHJlbWVtYmVyIHRoaW5ncywga25vdyBzdHVmZiwgZmlndXJlIHRoaW5ncyBvdXQuIFRoZXNlIGl0ZW1zIHdlcmUgY2hvc2VuIHRvIGFzIHNob3J0IGFzIHBvc3NpYmxlIGFuZCBoaWdobHkgZmFtaWxpYXIgdG8geW91bmcgcHJlc2Nob29sIGNoaWxkcmVuOyB0aGV5IHdlcmUgc2VsZWN0ZWQgZnJvbSBhIGxhcmdlciBwaWxvdCBzdHVkeSBpbiB3aGljaCB3ZSBhc2tlZCAzLSB0byA1LXllYXItb2xkIGNoaWxkcmVuIHRvIGNvbXBsZXRlIHN0b3JpZXMgdGhhdCBiZWdhbiB3aXRoIGVhY2ggb2YgdGhlc2UgbWVudGFsIGNhcGFjaXRpZXMgYXMgYSBwcmVtaXNlIChlLmcuLCAiTGV0J3MgaW1hZ2luZSBhIHBlcnNvbiB3aG8gbG92ZXMgc29tZW9uZS4gV2hhdCBoYXBwZW5zIG5leHQ/IjsgIk5vdyBsZXQncyBwcmV0ZW5kIHRoYXQgc29tZW9uZSByZW1lbWJlcnMgc29tZXRoaW5nLiBXaGF0IGhhcHBlbnMgbmV4dD8iKSBhbmQganVkZ2VkIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdGhlaXIgc3RvcnkgY29tcGxldGlvbi4gV2UgZnVydGhlciBkZXNpZ25lZCB0aGUgc2V0IG9mIGl0ZW1zIHNvIHRoYXQgZWFjaCBjYXRlZ29yeSBpbmNsdWRlZCBhIHZhcmlldHkgb2YgcGhyYXNpbmdzIChlLmcuLCBmZWVsIGh1bmdyeSB2cy4gZ2V0IHRoaXJzdHk7IHJlbWVtYmVyIHRoaW5ncyB2cy4ga25vdyBzdHVmZikgYW5kIHZhbGVuY2VzIHdoZW4gYXBwcm9wcmlhdGUgKGUuZy4sIGZlZWwgaGFwcHkgdnMuIGdldCBzYWQpOyB3aGVuIHBvc3NpYmxlLCB3ZSBhaW1lZCB0byBoYXZlIHBocmFzaW5ncyB2YXJ5IG9ydGhvZ29uYWxseSB3aXRoIGNhdGVnb3JpZXMsIHN1Y2ggdGhhdCAiZ2V0IiBhbmQgImZlZWwiIGFwcGVhcmVkIHJvdWdobHkgZXF1YWxseSBvZnRlbiBhbW9uZyB0aGUgYm9kaWx5IGFuZCBzb2NpYWwtZW1vdGlvbmFsIGl0ZW1zLCBhbmQgInRoaW5ncyIgYXBwZWFyZWQgZXF1YWxseSBvZnRlbiBhbW9uZyB0aGUgYm9kaWx5IGFuZCBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBpdGVtcy4gQXMgaW4gU3R1ZGllcyAxLTIsIGVhY2ggbWVudGFsIGNhcGFjaXR5IHdhcyBhc3NvY2lhdGVkIHdpdGggYSBzaG9ydCwgcHJlc2V0IGRlZmluaXRpb24sIHdoaWNoIHdhcyByZWFkIHRvIGNoaWxkcmVuIGlmIHRoZXkgZXhwcmVzc2VkIHVuY2VydGFpbnR5IGFib3V0IHdoYXQgYSB3b3JkIG1lYW50IG9yIGRpZCBub3QgcmVzcG9uZCBhZnRlciBwcm9tcHRpbmcgdXNlIG9mIHRoZSByZXNwb25zZSBzY2FsZS4KCkNoaWxkcmVuIGZpcnN0IGFzc2Vzc2VkIGFsbCAxOCBtZW50YWwgY2FwYWNpdGllcyBmb3Igb25lIG9mIHRoZSB0YXJnZXQgY2hhcmFjdGVycyAoZS5nLiwgdGhlIGJlZXRsZSksIHRoZW4gY29tcGxldGVkIGFuIGVhc3kgamlnc2F3IHB1enpsZSBmZWF0dXJpbmcgY2xvdGhpbmcgYW5kIGFjY2Vzc29yaWVzIGFwcHJvcHJpYXRlIGZvciBhIHJhaW55IGRheSAod2hpY2ggdG9vayBhYm91dCAzMC02MCBzZWNvbmQgdG8gY29tcGxldGUpLCBhbmQgZmluYWxseSBhc3Nlc3NlZCBhbGwgMTggbWVudGFsIGNhcGFjaXRpZXMgZm9yIHRoZSBvdGhlciB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCB0aGUgcm9ib3QpLgoKVGhpcyBtb2RpZmllZCBwcm9jZWR1cmXigJRwYXJ0aWN1bGFybHkgbW92aW5nIHRoZSBleHBlcmltZW50IG9mZiBvZiB0aGUgY29tcHV0ZXIgZm9yIGNoaWxkcmVu4oCUcmVxdWlyZWQgY2hhbmdlcyB0byB0aGUgZXhwZXJpbWVudGFsIGRlc2lnbi4gUmF0aGVyIHRoYW4gcmFuZG9tbHkgYXNzaWduaW5nIGNoaWxkcmVuIHRvIGFzc2VzcyB0aGUgYmVldGxlIGZpcnN0IG9yIHRoZSByb2JvdCBmaXJzdCwgdGhlIG9yZGVyIG9mIHRhcmdldCBlbnRpdGllcyB3YXMgY291bnRlcmJhbGFuY2VkIGluIGFkdmFuY2UuIExpa2V3aXNlLCByYXRoZXIgdGhhbiBhc2tpbmcgYWJvdXQgdGhlIDE4IG1lbnRhbCBjYXBhY2l0aWVzIGluIGEgcmFuZG9tIG9yZGVyLCBxdWVzdGlvbnMgYWJvdXQgdGhlIGZpcnN0IHRhcmdldCBlbnRpdHkgd2VyZSBhc2tlZCBpbiBvbmUgb2YgOCBwcmUtbWFkZSByYW5kb20gb3JkZXJzLCBhbmQgcXVlc3Rpb25zIGFib3V0IHRoZSBzZWNvbmQgdGFyZ2V0IGVudGl0eSB3ZXJlIGFza2VkIGluIHRoZSByZXZlcnNlIG9yZGVyLiBUaGUgb3JkZXIgb2YgdGhlIHRhcmdldCBlbnRpdGllcyAoYmVldGxlLXJvYm90IG9yIHJvYm90LWJlZXRsZSkgYW5kIHRoZSBvcmRlciBvZiB0aGUgbWVudGFsIGNhcGFjaXR5IHF1ZXN0aW9ucyAoMS04KSB3ZXJlIGZ1bGx5IGNyb3NzZWQgYWNyb3NzIHBhcnRpY2lwYW50cy4gCgpBZHVsdHMgcGFydGljaXBhdGVkIGluIGFuIG9ubGluZSB2ZXJzaW9uIG9mIHRoaXMgc2FtZSB0YXNrLCB3aXRob3V0IGEgYnJlYWsgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycy4gQXMgaW4gU3R1ZGllcyAxIGFuZCAyLCBhZHVsdHMgY2xpY2tlZCB0aHJvdWdoIGEgd2Vic2l0ZSBhdCB0aGVpciBvd24gcGFjZSwgd2l0aCBvbmUgdHJpYWwgcHJlc2VudGVkIG9uIGVhY2ggcGFnZSBhbmQgbm8gYWJpbGl0eSB0byBnbyBiYWNrd2FyZHMuIAoKIyMjIERhdGEgcHJvY2Vzc2luZwoKV2UgZGlkIG5vdCByZWNvcmQgcmVzcG9uc2UgdGltZXMgb3IgdXNlIHRoaXMgYXMgYSBjcml0ZXJpb24gZm9yIGluY2x1c2lvbi4gQXMgaW4gU3R1ZGllcyAxLTIsIHdlIHJldGFpbmVkIHBhcnRpY2lwYW50cyByZWdhcmRsZXNzIG9mIHNraXBwZWQgdHJpYWxzIChuPVhYIHRyaWFsczsgWFglIG9mIGFsbCB0cmlhbHMpLgoKIyMgUmVzdWx0cwoKWFgKCiMjIERpc2N1c3Npb24KClhYCgojIEFzc2Vzc2luZyBhZ2UtcmVsYXRlZCBjaGFuZ2VzIGluIGNvbmNlcHR1YWwgc3RydWN0dXJlIGNvbnRpbnVvdXNseTogQSByZS1hbmFseXNpcyBvZiBTdHVkaWVzIDEtMwoKVGFrZW4gdG9nZXRoZXIsIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNlcyAoRUZBcykgb2YgZGlmZmVyZW50IGFnZSBncm91cHMgc3VnZ2VzdCB0aGF0IHRoYXQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgdW5kZXJseWluZyA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyAoU3R1ZGllcyAyLTMpIGRpZmZlcnMgZnJvbSB0aGUgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgdW5kZXJseWluZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3MgYW5kIGFkdWx0cycgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyAoU3R1ZGllcyAxLTIpLiBUaGlzIGRhdGEtZHJpdmVuLCAiYm90dG9tLXVwIiBhcHByb2FjaCB0byBpbmZlcnJpbmcgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgYXQgdGhlIGdyb3VwIGxldmVsIHByb3ZpZGVzIG5vdmVsIGluc2lnaHRzIGludG8gaG93IGNoaWxkcmVuJ3MgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlIG1pZ2h0IGV2b2x2ZSBhY3Jvc3MgY2hpbGRob29kIHRoYXQgd2Ugd291bGQgbm90IGhhdmUgYW50aWNpcGF0ZWQgYSBwcmlvcmkuIEEgc2ltaWxhciBwYXR0ZXJuIG9mIGRpZmZlcmVuY2VzIGJldHdlZW4geW91bmdlciBhbmQgb2xkZXIgY2hpbGRyZW4gZW1lcmdlZCBvcmdhbmljYWxseSBhY3Jvc3MgbXVsdGlwbGUgc3R1ZGllcyAoU3R1ZHkgMiBhbmQgU3R1ZGllcyAxIHZzLiAzKSwgZ2l2aW5nIHVzIHJlYXNvbiB0byB0aGluayB0aGF0IHRoZXkgcmVmbGVjdCBzb21ldGhpbmcgcmVhbCBhYm91dCBjaGlsZHJlbidzIGRldmVsb3BpbmcgdW5kZXJzdGFuZGluZyBvZiBtZW50YWwgbGlmZS4KCkhvd2V2ZXIsIHRoaXMgYXBwcm9hY2ggdG8gYW5hbHl6aW5nIGRhdGEgY29tZXMgYXQgc29tZSBjb3N0LiBFRkEgaXMgYSBncm91cC1sZXZlbCBhbmFseXNpcywgY2FwYWJsZSBvZiByZXZlYWxpbmcgbGF0ZW50IHN0cnVjdHVyZXMgdW5kZXJseWluZyBjb3ZhcmlhbmNlIHBhdHRlcm5zIGFjcm9zcyBhIGxhcmdlIHNldCBvZiBvYnNlcnZhdGlvbnM7IHVzaW5nIHRoaXMgYXBwcm9hY2ggdG8gc3R1ZHkgY29uY2VwdHVhbCBzdHJ1Y3R1cmUgYXQgdGhlIGluZGl2aWR1YWwgbGV2ZWwgd291bGQgcmVxdWlyZSBodW5kcmVkcyBvZiBvYnNlcnZhdGlvbnMgcGVyIHBhcnRpY2lwYW50LCB3aGljaCBpcyBub3QgZmVhc2libGUgd2l0aCB5b3VuZyBjaGlsZHJlbi4gRXZlbiBjb2xsZWN0aW5nIGVub3VnaCBvYnNlcnZhdGlvbnMgcGVyIGFnZSBncm91cCB3YXMgbm8gc21hbGwgZmVhdDsgaW4gb3JkZXIgdG8gZmFjaWxpdGF0ZSBkYXRhIGNvbGxlY3Rpb24gZm9yIFN0dWRpZXMgMS0zIHdlIG9wdGVkIGZvciBmYWlybHkgd2lkZSBhZ2UgcmFuZ2VzIHNwYW5uaW5nIDMgeWVhcnMgZm9yIGVhY2ggZ3JvdXAgKDQtNiB5ZWFycyBhbmQgNy05IHllYXJzKS4gQ2F0ZWdvcml6aW5nIGNoaWxkcmVuIGFzICJ5b3VuZ2VyIiB2cy4gIm9sZGVyIiB1c2luZyBzdWNoIHdpZGUgYWdlIHJhbmdlcyBoYXMgcHJvdmlkZWQgaW50cmlndWluZyBzbmFwLXNob3RzIG9mIGNoaWxkcmVuIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gZGV2ZWxvcG1lbnTigJRidXQgdGhpcyBpcywgb2YgY291cnNlLCBhIHJhdGhlciBjcnVkZSB3YXkgb2YgY2hhcmFjdGVyaXppbmcgZGV2ZWxvcG1lbnRhbCBjaGFuZ2UuIAoKQmV0d2VlbiBTdHVkaWVzIDEtMywgaG93ZXZlciwgYSB0b3RhbCBvZiA1NDUgY2hpbGRyZW4gYmV0d2VlbiB0aGUgYWdlcyBvZiA0LjAwLTkuOTkgeWVhcnMgZWFjaCBwcm92aWRlZCBiZXR3ZWVuIDIwLTQwIHJlc3BvbnNlcyB0byBxdWVzdGlvbnMgYWJvdXQgdmFyaW91cyB0YXJnZXQgZW50aXRpZXMnIG1lbnRhbCBjYXBhY2l0aWVzLiBXaXRoIGEgZGlmZmVyZW50IGtpbmQgb2YgYW5hbHlzaXMsIHRoaXMgZGF0YXNldCBoYXMgdGhlIHBvdGVudGlhbCB0byBhZGRyZXNzIHF1ZXN0aW9ucyBhYm91dCBjb25jZXB0dWFsIGRldmVsb3BtZW50IGF0IGEgbXVjaCBtb3JlIGZpbmUtZ3JhaW5lZCBsZXZlbCB0aGFuIHdoYXQgZ3JvdXAtbGV2ZWwgRUZBcyBoYXZlIHJldmVhbGVkIHNvIGZhci4gV2l0aCB0aGlzIGluIG1pbmQsIHdlIG5vdyBwcmVzZW50IGEgbm92ZWwgcmUtYW5hbHlzaXMgb2YgU3R1ZGllcyAxLTMsIGFpbWVkIGF0IGNoYXJhY3Rlcml6aW5nIGFnZS1yZWxhdGVkIGRpZmZlcmVuY2VzIGluIGNvbmNlcHR1YWwgc3RydWN0dXJlIGNvbnRpbnVvdXNseSBhY3Jvc3MgZGV2ZWxvcG1lbnQuIE91ciBnb2FsIGluIHRoZXNlIHBvc3QtaG9jIGFuYWx5c2VzIHdhcyB0byBhc3Nlc3MgdGhlIGRpZmZlcmVudGlhdGlvbiBvZiB3aGF0IHdlJ3ZlIGNhbGxlZCBib2R5LCBoZWFydCwgYW5kIG1pbmQgaW4gaW5kaXZpZHVhbCBjaGlsZHJlbuKAlGEga2luZCBvZiBub24tcGFyYW1ldHJpYywgcGFydGljaXBhbnQtIGxldmVsIGFuYWx5c2lzIG1lYW50IHRvIHBhcmFsbGVsIHRoZSBFRkFzIHJlcG9ydGVkIGFib3ZlLiAKCldlIGJhc2VkIHRoaXMgYW5hbHlzaXMgb24gdGhlIGludHVpdGlvbiB0aGF0IGEgY2hpbGQgd2hvIGRpZmZlcmVudGlhdGVzIGNsZWFybHkgYmV0d2VlbiB0d28gY2F0ZWdvcmllcyBvZiBtZW50YWwgY2FwYWNpdGllcyAoZS5nLiwgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBib2R5IHZzLiBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyBvZiB0aGUgaGVhcnQpIHdpbGwgZXZhbHVhdGUgbWVudGFsIGNhcGFjaXRpZXMgcmVsYXRlZCB0byB0aGVzZSBjYXRlZ29yaWVzIHNvbWV3aGF0IGluZGVwZW5kZW50bHkuIFN1Y2ggYSBjaGlsZCB3aWxsIHNvbWV0aW1lcyBlbmQgdXAgZW5kb3JzaW5nIG1lbnRhbCBjYXBhY2l0aWVzIGluIG9uZSBjYXRlZ29yeSB3aGlsZSByZWplY3RpbmcgbWVudGFsIGNhcGFjaXRpZXMgaW4gdGhlIG90aGVyIChlLmcuLCBlbmRvcnNpbmcgbW9zdCBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgYnV0IHJlamVjdGluZyBtb3N0IHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzKeKAlHdoZXJlYXMgYSBjaGlsZCB3aG8gZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZXNlIGNhdGVnb3JpZXMgbWlnaHQgYmUgbW9yZSBsaWtlbHkgdG8gZW5kb3JzZSBvciByZWplY3QgYWNyb3NzIHRoZSBib2FyZCAoZS5nLiwgZW5kb3JzaW5nIGVxdWFsIG51bWJlcnMgb2YgcGh5c2lvbG9naWNhbCBhbmQgc29jaWFsLWVtb3Rpb25hbCBpdGVtcykuIE9mIGNvdXJzZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgY2hhcmFjdGVyIHRoZXkgaGFwcGVuIHRvIGV2YWx1YXRlLCBldmVuIGNoaWxkcmVuIHdpdGggY2xlYXJseSBkaWZmZXJlbnRpYXRlZCBjYXRlZ29yaWVzIG1pZ2h0IGVuZCB1cCBlbmRvcnNpbmcgZXF1YWwgbnVtYmVycyBvZiBjYXBhY2l0aWVzIGluIGJvdGguIEJ1dCBpZiB0aGUgZGlmZmVyZW50aWF0aW9uIG9mIHR3byBjYXRlZ29yaWVzIGJlY29tZXMgc3Ryb25nZXIgb3ZlciBkZXZlbG9wbWVudCwgd2UgbWlnaHQgZXhwZWN0IHRoYXQsIG9uIGF2ZXJhZ2UsIHRoZSBkaWZmZXJlbmNlIGluIHRoZSBudW1iZXIgb2YgZW5kb3JzZW1lbnRzIGJldHdlZW4gdGhlc2UgY2F0ZWdvcmllcyB3b3VsZCBpbmNyZWFzZSB3aXRoIGFnZS4gCgpGb2xsb3dpbmcgdGhpcyBsb2dpYywgd2UgcmUtYW5hbHl6ZWQgdGhlIGRhdGEgZnJvbSBTdHVkaWVzIDEtMyB0byBhc3Nlc3MgY2hhbmdlcyBpbiBjb25jZXB0dWFsIHN0cnVjdHVyZSBjb250aW51b3VzbHkgYmV0d2VlbiA0LTkgeWVhcnMgb2YgYWdlLgoKIyMgTWV0aG9kCgojIyMgUGFydGljaXBhbnRzCgpXZSBpbmNsdWRlZCBhbGwgb2YgdGhlIGNoaWxkIHBhcnRpY2lwYW50cyBmcm9tIFN0dWRpZXMgMS0zIGluIHRoaXMgYW5hbHlzaXMgKHRvdGFsIE49NTQ1IGNoaWxkcmVuKS4gVGhpcyBjb21iaW5lZCBzYW1wbGUgb2YgY2hpbGRyZW4gcmFuZ2VkIGluIGFnZSBmcm9tIDQuMDAtOS45OSB5ZWFycyAobWVkaWFuOiBYWCB5ZWFycyk7IHNlZSBNZXRob2RzIGZvciBTdHVkaWVzIDEtMyBmb3IgZnVydGhlciBkZW1vZ3JhcGhpYyBpbmZvcm1hdGlvbi4KCiMjIyBEYXRhIHByZXBhcmF0aW9uCgpGb2xsb3dpbmcgdGhlIGxvZ2ljIG91dGxpbmVkIGFib3ZlLCB3ZSBkZXNpZ25hdGVkIGEgc2V0IG9mIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyB0byByZXByZXNlbnQgY2F0ZWdvcmllcyBvZiBib2R5LCBoZWFydCwgYW5kIG1pbmQgZm9yIGVhY2ggc3R1ZHkgYW5kIHRhbGxpZWQgdXAgdGhlIG51bWJlciBvZiAiZW5kb3JzZW1lbnRzIiAocmVzcG9uc2VzIG9mIHllcyBvciBraW5kYSkgd2l0aGluIGVhY2ggY2F0ZWdvcnkgZm9yIGVhY2ggY2hpbGQgKHNlcGFyYXRpbmcgb3V0IGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIHRvIHRoZSBiZWV0bGUgdnMuIHRoZSByb2JvdCwgZm9yIFN0dWR5IDMpLiBGb3IgdGhlIHNha2Ugb2YgY29tcGFyYWJpbGl0eSBhY3Jvc3Mgc3R1ZGllcyBhbmQgYWNyb3NzIGNhdGVnb3JpZXMsIHdlIGluY2x1ZGVkIGV4YWN0bHkgc2l4IG1lbnRhbCBjYXBhY2l0aWVzIGluIGVhY2ggY2F0ZWdvcnkuCgpGb3IgU3R1ZHkgMywgdGhlc2UgY2F0ZWdvcmllcyBoYWQgYWxyZWFkeSBiZWVuIGRlZmluZWQgaW4gdGhlIGluaXRpYWwgZGVzaWduIG9mIHRoZSBzdHVkeTogVG8gcmVpdGVyYXRlLCB0aGUgYm9keSBjYXRlZ29yeSBpbmNsdWRlZCBmZWVsIGh1bmdyeSwgZ2V0IHRoaXJzdHksIGZlZWwgc2ljaywgZmVlbCB0aXJlZCwgZ2V0IHNjYXJlZCwgYW5kIHNtZWxsIHRoaW5nczsgdGhlIGhlYXJ0IGNhdGVnb3J5IGluY2x1ZGVkIGxvdmUgc29tZW9uZSwgaGF0ZSBzb21lb25lLCBmZWVsIGhhcHB5LCBnZXQgc2FkLCBmZWVsIHNvcnJ5LCBnZXQgbG9uZWx5OyBhbmQgdGhlIG1pbmQgY2F0ZWdvcnkgaW5jbHVkZWQgc2VlLCBoZWFyLCB0aGluaywgcmVtZW1iZXIgdGhpbmdzLCBrbm93IHN0dWZmLCBmaWd1cmUgdGhpbmdzIG91dC4KCkZvciBTdHVkaWVzIDEtMiwgd2UgdXNlZCBhZHVsdHMnIEVGQSByZXN1bHRzIGZyb20gU3R1ZHkgMSB0byBkZWZpbmUgY2F0ZWdvcmllcy4KRm9yIHRoZSBib2R5IGNhdGVnb3J5LCB3ZSBpbmNsdWRlZCBnZXQgaHVuZ3J5LCBmZWVsIHBhaW4sIHNtZWxsIHRoaW5ncywgZmVlbCBzY2FyZWQsIGZlZWwgc2ljaywgYW5kIGZlZWwgdGlyZWQuIFRoZXNlIHNpeCBpdGVtcyB3ZXJlIGFtb25nIHRoZSBzZXZlbiBzdHJvbmdlc3QgcG9zaXRpdmUgZmFjdG9yIGxvYWRpbmdzIG9uIEZhY3RvciBYWCBhbW9uZyBhZHVsdHMgaW4gU3R1ZHkgMSAoYWxsIGxvYWRpbmdzIOKJpTAuNjYpLCB3ZXJlIGluY2x1ZGVkIGluIGJvdGggU3R1ZGllcyAxIGFuZCAyLCBhbmQgaGFkIG1heGltYWwgb3ZlcmxhcCB3aXRoIHRoZSBib2R5IGNhdGVnb3J5IGFzIGRlZmluZWQgZm9yIFN0dWR5IDMgKGZpdmUgb2Ygc2l4IGl0ZW1zIHdlcmUgbmVhcmx5IGlkZW50aWNhbCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGZlZWwgcGFpbiBpbnN0ZWFkIG9mIGdldCB0aGlyc3R5KS4gCgpGb3IgdGhlIGhlYXJ0IGNhdGVnb3J5LCB3ZSBpbmNsdWRlZCBmZWVsIGxvdmUsIGZlZWwgaGFwcHksIGZlZWwgc2FkLCBnZXQgYW5ncnksIGZlZWwgZ3VpbHR5LCBhbmQgZ2V0IGh1cnQgZmVlbGluZ3MuIFRoZXNlIHNpeCBpdGVtcyB3ZXJlIGFtb25nIHRoZSB0ZW4gc3Ryb25nZXN0IHBvc2l0aXZlIGZhY3RvciBsb2FkaW5ncyBvbiBGYWN0b3IgWFggYW1vbmcgYWR1bHRzIGluIFN0dWR5IDEgKGFsbCBmYWN0b3IgbG9hZGluZ3Mg4omlMC41MSksIHdlcmUgaW5jbHVkZWQgaW4gYm90aCBTdHVkaWVzIDEgYW5kIDIsIGFuZCBoYWQgbWF4aW1hbCBvdmVybGFwIHdpdGggdGhlIGhlYXJ0IGNhdGVnb3J5IGFzIGRlZmluZWQgZm9yIFN0dWR5IDMgKHRocmVlIG9mIHNpeCBpdGVtcyB3ZXJlIG5lYXJseSBpZGVudGljYWwsIGFuZCB0aGUgb3RoZXJzIHdlcmUgbWF0Y2hlZCBpbiB2YWxlbmNlIGFuZCBnZW5lcmFsIG1lYW5pbmc6IGdldCBhbmdyeSBpbnN0ZWFkIG9mIGhhdGUgc29tZW9uZTsgZmVlbCBndWlsdHkgaW5zdGVhZCBvZiBmZWVsIHNvcnJ5OyBhbmQgZ2V0IGh1cnQgZmVlbGluZ3MgaW5zdGVhZCBvZiBnZXQgbG9uZWx5KS4gCgpGaW5hbGx5LCBmb3IgdGhlIG1pbmQgY2F0ZWdvcnksIHdlIGluY2x1ZGVkIGZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaW5ncywgcmVtZW1iZXIgdGhpbmdzLCBiZSBhd2FyZSBvZiB0aGluZ3MsIHNlbnNlIHdoZXRoZXIgc29tZXRoaW5nIGlzIGNsb3NlIGJ5IG9yIGZhciBhd2F5LCBzZW5zZSB0ZW1wZXJhdHVyZXMsIGFuZCBtYWtlIGNob2ljZXMuIFRoZXNlIHNpeCBpdGVtcyB3ZXJlIGFtb25nIHRoZSB0ZW4gc3Ryb25nZXN0IHBvc2l0aXZlIGZhY3RvciBsb2FkaW5ncyBvbiBGYWN0b3IgWFggYW1vbmcgYWR1bHRzIGluIFN0dWR5IDEgKGFsbCBmYWN0b3IgbG9hZGluZ3Mg4omlMC41MCkgYW5kIHdlcmUgaW5jbHVkZWQgaW4gYm90aCBTdHVkaWVzIDEgYW5kIDIuIFRoZXkgYWxzbyBoYWQgcmVsYXRpdmVseSBzdHJvbmcgb3ZlcmxhcCB3aXRoIHRoZSBtaW5kIGNhdGVnb3J5IGFzIGRlZmluZWQgZm9yIFN0dWR5IDM6IFR3byBvZiBzaXggaXRlbXMgd2VyZSBuZWFybHkgaWRlbnRpY2FsLCBhbmQgdHdvIG90aGVycyB3ZXJlIG1hdGNoZWQgaW4gZ2VuZXJhbCBtZWFuaW5nIChiZSBhd2FyZSBvZiB0aGluZ3MgaW5zdGVhZCBvZiBzZWU7IHNlbnNlIHRlbXBlcmF0dXJlcyBpbnN0ZWFkIG9mIGhlYXIpOyB0aGUgb3RoZXJzIChzZW5zZSB3aGV0aGVyIHNvbWV0aGluZyBpcyBjbG9zZSBieSBvciBmYXIgYXdheSBhbmQgbWFrZSBjaG9pY2VzKSB3ZXJlIG5vdCBwYXJ0aWN1bGFybHkgd2VsbC1tYXRjaGVkIHRvIHRoZSBTdHVkeSAzIHN1YnN0aXR1dGVzIChrbm93IHN0dWZmIGFuZCB0aGluayksIGJ1dCBhbGxvd2VkIHVzIHRvIHVzZSB0aGUgc2FtZSBzZXQgb2YgaXRlbXMgdG8gZGVmaW5lIHRoZSBtaW5kIGNhdGVnb3J5IGZvciBTdHVkaWVzIDEgYW5kIDIsIHdoaWNoIHdlIGRlY2lkZWQgd2FzIG91ciBwcmlvcml0eS4gCgpXZSBub3RlIHRoYXQgdGhlcmUgYXJlIG1hbnkgInJlc2VhcmNoZXIgZGVncmVlcyBvZiBmcmVlZG9tIiBpbiB0aGVzZSBjaG9pY2VzOyB3ZSBoYXZlIHN0cml2ZW4gdG8gYmUgYXMgdHJhbnNwYXJlbnQgYXMgcG9zc2libGUgYWJvdXQgb3VyIHByb2Nlc3MsIGFuZCBlbmNvdXJhZ2UgdGhlIGN1cmlvdXMgcmVhZGVyIHRvIGV4cGxvcmUgb3RoZXIgY2hvaWNlcyB1c2luZyBvdXIgZGF0YSAob3Blbmx5IGF2YWlsYWJsZSBhdCBYWCkuCgpUaGlzIGxlZnQgdXMgd2l0aCBhIGRhdGFzZXQgaW4gd2hpY2ggZWFjaCBjaGlsZCB3YXMgYXNzb2NpYXRlZCB3aXRoICJlbmRvcnNlbWVudCB0YWxsaWVzIiBiZXR3ZWVuIDAtNiBmb3IgYm9keSwgZm9yIGhlYXJ0LCBhbmQgZm9yIG1pbmQsIGZvciBlYWNoIG9mIHRoZSB0YXJnZXQgZW50aXRpZXMgdGhhdCBjaGlsZCBhc3Nlc3NlZCAoU3R1ZGllcyAxLTI6IG9uZSB0YXJnZXQgcGVyIGNoaWxkOyBTdHVkeSAzOiB0d28gdGFyZ2V0cyBwZXIgY2hpbGQpOyB0aGlzIGRhdGEgYWxzbyBpbmNsdWRlZCBlYWNoIGNoaWxkJ3MgZXhhY3QgYWdlLgoKIyMjIEFuYWx5c2lzIHBsYW4KCkZvbGxvd2luZyB0aGUgbG9naWMgZGVzY3JpYmVkIGFib3ZlLCB3ZSBjb21wYXJlZCBkaWZmZXJlbmNlcyBpbiBjaGlsZHJlbidzIGVuZG9yc2VtZW50IHRhbGxpZXMgYWNyb3NzIHBhaXJzIG9mIGNhdGVnb3JpZXM6IGJvZHkgbWludXMgaGVhcnQsIGJvZHkgbWludXMgbWluZCwgYW5kIGhlYXJ0IG1pbnVzIG1pbmQsIGludGVycHJldGluZyBsYXJnZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNhdGVnb3JpZXMgYXMgcmVmbGVjdGluZyBzdHJvbmcgZGlmZmVyZW50aWF0aW9uIG9mIHRob3NlIHR3byBjYXRlZ29yaWVzIGFuZCBhZ2UtcmVsYXRlZCBpbmNyZWFzZXMgaW4gZGlmZmVyZW5jZXMgdG8gcmVmbGVjdCBpbmNyZWFzaW5nIGRpZmZlcmVudGlhdGlvbiBvdmVyIGRldmVsb3BtZW50LiAKCltPUFRJT04gIzE6IFdlIGNvbmR1Y3RlZCB0aHJlZSBzZXBhcmF0ZSBtaXhlZC1lZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24gYW5hbHlzZXPigJRvbmUgZm9yIGVhY2ggcGFpciBvZiBjYXRlZ29yaWVz4oCUdG8gYW5hbHl6ZSB0aGVzZSBhZ2UtcmVsYXRlZCBjaGFuZ2VzIGluIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBkaWZmZXJlbmNlcyAodGhlb3JldGljYWwgcmFuZ2U6IDAtNikuIEZvciBlYWNoIGFuYWx5c2lzLCB3ZSByZWdyZXNzZWQgY2hpbGRyZW4ncyBleGFjdCBhZ2UgKGNlbnRlcmVkIGF0IHRoZSBtZWFuLCBYWCB5ZWFycykgb250byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gY2F0ZWdvcmllcyBpbiBxdWVzdGlvbiAoZS5nLiwgYm9keSBtaW51cyBoZWFydCksIHVzaW5nIFBvaXNzb24gZGlzdHJpYnV0aW9ucyBhbmQgbWF4aW1hbCByYW5kb20gZWZmZWN0cyBzdHJ1Y3R1cmVzLiBYWCBBTFNPIFJBVyBESUZGRVJFTkNFUz9dCgpbT1BUSU9OICMyOiBXZSBjb25kdWN0ZWQgYSBtaXhlZC1lZmZlY3RzIEJheWVzaWFuIHJlZ3Jlc3Npb24gYW5hbHlzaXMgdG8gYW5hbHl6ZSBkaWZmZXJlbmNlcyBpbiBlbmRvcnNlbWVudHMgYWNyb3NzIGNhdGVnb3JpZXMgYW5kIHdoZXRoZXIgdGhleSB2YXJpZWQgd2l0aCBjaGlsZHJlbidzIGFnZSwgdXNpbmcgY2hpbGRyZW4ncyBleGFjdCBhZ2UgKGNlbnRlcmVkIGF0IHRoZSBtZWFuLCBYWCB5ZWFycyksIHRoZSBjYXRlZ29yeSAoY29kZWQgd2l0aCBvcnRob2dvbmFsIGNvbnRyYXN0cyBjb21wYXJpbmcgYm9keSBhbmQgaGVhcnQgdG8gbWluZCwgYW5kIGJvZHkgdG8gaGVhcnQpLCBhbmQgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBhZ2UgYW5kIGNhdGVnb3J5IHRvIHByZWRpY3QgdGhlIGVuZG9yc2VtZW50IHRhbGx5ICh0aGVvcmV0aWNhbCByYW5nZTogMC02KS4gV2UgdXNlZCBQb2lzc29uIGRpc3RyaWJ1dGlvbnMgdG8gbW9kZWwgdGhlc2UgdGFsbGllcywgYW5kIG1heGltYWwgcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlcy5dCgojIyBSZXN1bHRzCgpYWAoKIyMgRGlzY3Vzc2lvbgoKWFgKCiMgR2VuZXJhbCBEaXNjdXNzaW9uCgojIyBTdW1tYXJ5CgpUaGUgY3VycmVudCBzdHVkaWVzIHN1Z2dlc3QgdGhhdCBjaGlsZHJlbidzIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlIHVuZGVyZ28gc3Vic3RhbnRpYWwgZGV2ZWxvcG1lbnQgYmV0d2VlbiB0aGUgYWdlcyBvZiA0LTkgeWVhcnPigJRpbiB0d28gZGlzdGluY3Qgc2Vuc2VzLiAKCkZpcnN0LCBhbmFseXNlcyBvZiB0aGUgY29ycmVsYXRpb25hbCBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4ncyBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIChFRkFzKSBzdWdnZXN0ZWQgY2hhbmdlcyBpbiBjb25jZXB0dWFsIHN0cnVjdHVyZTogQmV0d2VlbiBlYXJseSBjaGlsZGhvb2QgKDQtNiB5ZWFyczsgU3R1ZGllcyAyLTMpIGFuZCBtaWRkbGUgY2hpbGRob29kICg3LTkgeWVhcnM7IFN0dWRpZXMgMS0yKSwgY2hpbGRyZW4ncyBzZW5zZSBvZiB3aGljaCBtZW50YWwgY2FwYWNpdGllcyAiZ28gdG9nZXRoZXIiIHNlZW1lZCB0byB1bmZvbGQgaW50byBhIGhpZ2hlci1kaW1lbnNpb25hbCBzcGFjZSwgY2hhcmFjdGVyaXplZCBieSBzdHJvbmdlciBkaWZmZXJlbnRpYXRpb24gb2YgdGhlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIHRoYXQgd2UndmUgY2FsbGVkICJoZWFydCIgZnJvbSB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBib2R5IGFuZCB0aGUgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIG9mIHRoZSBtaW5kLiAKTWVhbndoaWxlLCBhbmFseXNlcyBvZiBmYWN0b3Igc2NvcmVz4oCUc3VtbWFyaWVzIG9mIHdoaWNoIG1lbnRhbCBjYXBhY2l0aWVzIGNoaWxkcmVuIHRlbmRlZCB0byBhdHRyaWJ1dGUgdG8gd2hpY2ggdGFyZ2V0IGVudGl0aWVz4oCUcmV2ZWFsZWQgYSBzZWNvbmQga2luZCBvZiBhZ2UtcmVsYXRlZCBkaWZmZXJlbmNlOiB3aGF0IHdlIG1pZ2h0IGNhbGwgY2hhbmdlcyBpbiB0aGUgYXBwbGljYXRpb24gb2YgdGhlIGNvbmNlcHQuIFRoZXNlIGRpZmZlcmVuY2VzIHdlcmUgY2xlYXJlc3QgaW4gU3R1ZGllcyAxIGFuZCAzLCB3aGljaCBmb2N1c2VkIG9uIHR3byAiZWRnZSBjYXNlcyIgaW4gc29jaWFsIHJlYXNvbmluZyAoYmVldGxlcyBhbmQgcm9ib3RzKTogQmV0d2VlbiB0aGUgYWdlcyBvZiA0LTYgeWVhcnMgKFN0dWR5IDMpLCBYWCBGSUxMIElOLCB3aGlsZSBiZXR3ZWVuIHRoZSBhZ2VzIG9mIDctOSB5ZWFycyAoU3R1ZHkgMSksIGF0dHJpYnV0aW9ucyBvZiBib2R5IHRvIGJlZXRsZXMgYW5kIHJvYm90cyB3ZXJlIHJlbGF0aXZlbHkgc3RhYmxlIGFuZCBhZHVsdC1saWtlLCBhdHRyaWJ1dGlvbnMgb2YgaGVhcnQgdG8gdGhlc2UgImVkZ2UgY2FzZXMiIHN0YXJ0ZWQgb3V0IGhpZ2hlciB0aGFuIGFkdWx0cyBhbmQgZGVjcmVhc2VkIHRvIG5lYXJseSBhZHVsdC1saWtlIGxldmVscyBieSB0aGUgYWdlIG9mIDkgeWVhcnMsIGFuZCBhdHRyaWJ1dGlvbnMgb2YgbWluZCBzdGFydGVkIG91dCBsb3dlciB0aGFuIGFkdWx0cyBhbmQgaW5jcmVhc2VkIHRvIG5lYXJseSBhZHVsdC1saWtlIGxldmVscyBieSB0aGUgYWdlIG9mIDkgeWVhcnMuCgpYWCBHRAo=